🎯 scan 流程圖

AIVA 跨模組流程圖組合視覺化

316
流程圖總數
0
序列圖
316
流程圖
2025-10-17
生成日期

📑 目錄

1. aiva common schemas enhanced Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('scan_')} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('scan_')}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
2. aiva common schemas findings Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith("scan_'&...} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith("scan_'&...}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
3. aiva common schemas tasks Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('scan_')} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('scan_')}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
4. core aiva core execution task queue manager Function get scan progress
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取掃描進度\n\n Args:\n ...] n4[stats = self._scan_stats[sca...] n5[total = stats['total']] n6[completed = stats['completed'...] n7[failed = stats['failed']] n8[return {'scan_id': scan_id, ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取掃描進度\n\n        Args:\n         ...]
    n4[stats = self._scan_stats[sca...]
    n5[total = stats['total']]
    n6[completed = stats['completed'...]
    n7[failed = stats['failed']]
    n8[return {'scan_id': scan_id, ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
5. core aiva core ingestion scan module interface Function calculate risk score
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 計算資產風險分數\n\n Args:\n ...] n4[risk_score = 1] n5{if asset.type == 'URL'} n6{if asset.has_form} n7[risk_score += 3] n8[] n9{if asset.parameters} n10[risk_score += len(asset.parameters)] n11[] n12{if asset.type == 'API'} n13[risk_score += 2] n14[] n15[] n16[return min(risk_score, 10)] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n12 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n15 n12 -->|Yes| n13 n12 -->|No| n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        計算資產風險分數\n\n        Args:\n       ...]
    n4[risk_score = 1]
    n5{if asset.type == 'URL'}
    n6{if asset.has_form}
    n7[risk_score += 3]
    n8[]
    n9{if asset.parameters}
    n10[risk_score += len(asset.parameters)]
    n11[]
    n12{if asset.type == 'API'}
    n13[risk_score += 2]
    n14[]
    n15[]
    n16[return min(risk_score, 10)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n12
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n15
    n12 -->|Yes| n13
    n12 -->|No| n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
6. core aiva core ingestion scan module interface Function categorize asset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 資產分類\n\n Args:\n ...] n4[categories: list[str] = []] n5{if not hasattr(asset, 'value'...} n6[return categories] n7[] n8[url_path = str(asset.value).low...] n9{if any((keyword in url_path fo...} n10[categories.append('authentication&...] n11[] n12{if any((keyword in url_path fo...} n13[categories.append('administration&...] n14[] n15{if any((keyword in url_path fo...} n16[categories.append('api')] n17[] n18{if any((keyword in url_path fo...} n19[categories.append('file_handling&#...] n20[] n21{if any((keyword in url_path fo...} n22[categories.append('search')] n23[] n24{if asset.has_form} n25[categories.append('form_input&#39...] n26[] n27{if asset.parameters} n28[categories.append('parameterized&#...] n29[] n30[return categories] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n14 n13 --> n14 n14 --> n15 n15 -->|Yes| n16 n15 -->|No| n17 n16 --> n17 n17 --> n18 n18 -->|Yes| n19 n18 -->|No| n20 n19 --> n20 n20 --> n21 n21 -->|Yes| n22 n21 -->|No| n23 n22 --> n23 n23 --> n24 n24 -->|Yes| n25 n24 -->|No| n26 n25 --> n26 n26 --> n27 n27 -->|Yes| n28 n27 -->|No| n29 n28 --> n29 n29 --> n30 n30 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        資產分類\n\n        Args:\n           ...]
    n4[categories: list[str] = []]
    n5{if not hasattr(asset, 'value'...}
    n6[return categories]
    n7[]
    n8[url_path = str(asset.value).low...]
    n9{if any((keyword in url_path fo...}
    n10[categories.append('authentication&&#3...]
    n11[]
    n12{if any((keyword in url_path fo...}
    n13[categories.append('administration&&#3...]
    n14[]
    n15{if any((keyword in url_path fo...}
    n16[categories.append('api')]
    n17[]
    n18{if any((keyword in url_path fo...}
    n19[categories.append('file_handling&&#35...]
    n20[]
    n21{if any((keyword in url_path fo...}
    n22[categories.append('search')]
    n23[]
    n24{if asset.has_form}
    n25[categories.append('form_input&#39...]
    n26[]
    n27{if asset.parameters}
    n28[categories.append('parameterized&&#35...]
    n29[]
    n30[return categories]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n14
    n13 --> n14
    n14 --> n15
    n15 -->|Yes| n16
    n15 -->|No| n17
    n16 --> n17
    n17 --> n18
    n18 -->|Yes| n19
    n18 -->|No| n20
    n19 --> n20
    n20 --> n21
    n21 -->|Yes| n22
    n21 -->|No| n23
    n22 --> n23
    n23 --> n24
    n24 -->|Yes| n25
    n24 -->|No| n26
    n25 --> n26
    n26 --> n27
    n27 -->|Yes| n28
    n27 -->|No| n29
    n28 --> n29
    n29 --> n30
    n30 --> n2
7. core aiva core ingestion scan module interface Function process assets
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 處理資產清單,進行分類與標準化\n\n Args:\n...] n4[processed_assets = []] n5{for asset in assets} n6[processed_asset = {'asset_id&#39...] n7[processed_assets.append(processed_asset)] n8[] n9[return processed_assets] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        處理資產清單,進行分類與標準化\n\n        Args:\n...]
    n4[processed_assets = []]
    n5{for asset in assets}
    n6[processed_asset = {'asset_id&#39...]
    n7[processed_assets.append(processed_asset)]
    n8[]
    n9[return processed_assets]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
8. core aiva core ingestion scan module interface Function process fingerprints
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 處理技術指紋資料\n\n Args:\n ...] n4{if not fingerprints} n5[return {}] n6[] n7[return {'web_server': finger...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        處理技術指紋資料\n\n        Args:\n       ...]
    n4{if not fingerprints}
    n5[return {}]
    n6[]
    n7[return {'web_server': finger...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n2
9. core aiva core ingestion scan module interface Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from typing import Any] n5[from services.aiva_common.schemas import ScanCompl...] n6[class ScanModuleInterface(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from typing import Any]
    n5[from services.aiva_common.schemas import ScanCompl...]
    n6[class ScanModuleInterface(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
10. core aiva core processing scan result processor Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化處理器\n\n Args:\n ...] n4[self.scan_interface = scan_interface] n5[self.surface_analyzer = surface_analyzer] n6[self.strategy_adjuster = strategy_adjuster] n7[self.task_generator = task_generator] n8[self.task_queue_manager = task_queue_manager] n9[self.session_state_manager = session_state_manage...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化處理器\n\n        Args:\n         ...]
    n4[self.scan_interface = scan_interface]
    n5[self.surface_analyzer = surface_analyzer]
    n6[self.strategy_adjuster = strategy_adjuster]
    n7[self.task_generator = task_generator]
    n8[self.task_queue_manager = task_queue_manager]
    n9[self.session_state_manager = session_state_manage...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
11. core aiva core processing scan result processor Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n掃描結果處理器 - 七階段處理流程\n\n此模組封裝了核心引擎處理掃描結果的完整七階...] n4[from __future__ import annotations] n5[import json] n6[from typing import TYPE_CHECKING] n7[from services.aiva_common.schemas import ScanCompl...] n8[from services.aiva_common.utils import get_logger] n9{if TYPE_CHECKING} n10[from services.aiva_common.mq import Broker] n11[from services.core.aiva_core.analysis.dynamic_stra...] n12[from services.core.aiva_core.analysis.initial_surf...] n13[from services.core.aiva_core.execution.task_genera...] n14[from services.core.aiva_core.execution.task_queue_...] n15[from services.core.aiva_core.ingestion.scan_module...] n16[from services.core.aiva_core.state.session_state_m...] n17[] n18[logger = get_logger(__name__)] n19[class ScanResultProcessor(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n17 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n掃描結果處理器 - 七階段處理流程\n\n此模組封裝了核心引擎處理掃描結果的完整七階...]
    n4[from __future__ import annotations]
    n5[import json]
    n6[from typing import TYPE_CHECKING]
    n7[from services.aiva_common.schemas import ScanCompl...]
    n8[from services.aiva_common.utils import get_logger]
    n9{if TYPE_CHECKING}
    n10[from services.aiva_common.mq import Broker]
    n11[from services.core.aiva_core.analysis.dynamic_stra...]
    n12[from services.core.aiva_core.analysis.initial_surf...]
    n13[from services.core.aiva_core.execution.task_genera...]
    n14[from services.core.aiva_core.execution.task_queue_...]
    n15[from services.core.aiva_core.ingestion.scan_module...]
    n16[from services.core.aiva_core.state.session_state_m...]
    n17[]
    n18[logger = get_logger(__name__)]
    n19[class ScanResultProcessor(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n17
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n2
12. core aiva core ui panel dashboard Function create scan task
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['建立掃描任務.\n\n Args:\n target...] n4{if use_ai is None} n5[use_ai = self.mode in ('ai', ...] n6[] n7[task_id = f'scan_{hash(target_...] n8{if use_ai and self.ai_agent} n9[logger.info('\n[AI] 使用 AI 代理建立掃描任...] n10[result = self.ai_agent.invoke...] n11[task = {'task_id': task_id,...] n12[logger.info('\n[UI] 使用 UI 模式建立掃描任...] n13[task = {'task_id': task_id,...] n14[] n15[self.scan_tasks.append(task)] n16[logger.info(f'掃描任務已建立: {task_id}...] n17[return task] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n12 n9 --> n10 n10 --> n11 n11 --> n14 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['建立掃描任務.\n\n        Args:\n            target...]
    n4{if use_ai is None}
    n5[use_ai = self.mode in ('ai', ...]
    n6[]
    n7[task_id = f'scan_{hash(target_...]
    n8{if use_ai and self.ai_agent}
    n9[logger.info('\n[AI] 使用 AI 代理建立掃描任...]
    n10[result = self.ai_agent.invoke...]
    n11[task = {'task_id': task_id,...]
    n12[logger.info('\n[UI] 使用 UI 模式建立掃描任...]
    n13[task = {'task_id': task_id,...]
    n14[]
    n15[self.scan_tasks.append(task)]
    n16[logger.info(f'掃描任務已建立: {task_id&#125...]
    n17[return task]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n12
    n9 --> n10
    n10 --> n11
    n11 --> n14
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n2
13. function function postex lateral movement Function scan network
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 掃描網絡中的活躍主機\n\n Args:\n ...] n4[target = network or self.targ...] n5[self._log_action('scan_network&#3...] n6[result = {'test_name': &...] n7{if self.safe_mode} n8[result['mode'] = &...] n9[result['hosts'].append...] n10[result['mode'] = &...] n11[result['error'] = &&#...] n12[] n13[self.test_results.append(result)] n14[logger.info('network_scan_completed&&...] n15[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n10 n8 --> n9 n9 --> n12 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        掃描網絡中的活躍主機\n\n        Args:\n     ...]
    n4[target = network or self.targ...]
    n5[self._log_action('scan_network&#3...]
    n6[result = {'test_name': &...]
    n7{if self.safe_mode}
    n8[result['mode'] = &&#3...]
    n9[result['hosts'].append&#4...]
    n10[result['mode'] = &&#3...]
    n11[result['error'] = &&#...]
    n12[]
    n13[self.test_results.append(result)]
    n14[logger.info('network_scan_completed&&...]
    n15[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n10
    n8 --> n9
    n9 --> n12
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n2
14. function test schemas Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('scan_')} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('scan_')}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
15. integration aiva integration examples enhanced scan integration Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化處理器\n\n Args:\n ...] n4[self.engine = create_engine(databa...] n5[self.SessionLocal = sessionmaker(bind=se...] n6[Base.metadata.create_all(bind=self.engine)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化處理器\n\n        Args:\n         ...]
    n4[self.engine = create_engine(databa...]
    n5[self.SessionLocal = sessionmaker(bind=se...]
    n6[Base.metadata.create_all(bind=self.engine)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
16. integration aiva integration examples enhanced scan integration Function apply analysis results
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據分析結果應用標籤和更新狀態\n\n Args:\n...] n4{if correlation_result.get('att...} n5{for chain in correlation_resul...} n6{for step in chain.get('matche...} n7{for finding in step.get('finding...} n8[vuln_id = finding.get('finding...] n9{if vuln_id} n10[manager.add_vulnerability_tag(vuln_id, 'a...] n11[manager.add_vulnerability_tag(vuln_id, f"cha...] n12[] n13[] n14[] n15[] n16[] n17{if root_cause_result.get('root...} n18{for root_cause in root_cause_result...} n19{for vuln_id in root_cause.get('v...} n20[manager.add_vulnerability_tag(vuln_id, 'r...] n21[manager.add_vulnerability_tag(vuln_id, f"com...] n22[] n23[] n24[] n25{if sast_dast_result.get('confi...} n26{for flow in sast_dast_result[...} n27[sast_id = flow.get('sast_findi...] n28[dast_id = flow.get('dast_findi...] n29{if sast_id} n30[manager.add_vulnerability_tag(sast_id, 's...] n31[manager.add_vulnerability_tag(sast_id, 'h...] n32[] n33{if dast_id} n34[manager.add_vulnerability_tag(dast_id, 's...] n35[manager.add_vulnerability_tag(dast_id, 'h...] n36[] n37[] n38[] n39{if sast_dast_result.get('uncon...} n40{for unconfirmed in sast_dast_result[...} n41[vuln_id = unconfirmed.get('fin...] n42{if vuln_id} n43[manager.add_vulnerability_tag(vuln_id, 's...] n44[manager.add_vulnerability_tag(vuln_id, 'n...] n45[] n46[] n47[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n16 n5 -->|Yes| n6 n5 -->|No| n15 n6 -->|Yes| n7 n6 -->|No| n14 n7 -->|Yes| n8 n7 -->|No| n13 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n12 n10 --> n11 n11 --> n12 n12 --> n7 n13 --> n6 n14 --> n5 n15 --> n16 n16 --> n17 n17 -->|Yes| n18 n17 -->|No| n24 n18 -->|Yes| n19 n18 -->|No| n23 n19 -->|Yes| n20 n19 -->|No| n22 n20 --> n21 n21 --> n19 n22 --> n18 n23 --> n24 n24 --> n25 n25 -->|Yes| n26 n25 -->|No| n38 n26 -->|Yes| n27 n26 -->|No| n37 n27 --> n28 n28 --> n29 n29 -->|Yes| n30 n29 -->|No| n32 n30 --> n31 n31 --> n32 n32 --> n33 n33 -->|Yes| n34 n33 -->|No| n36 n34 --> n35 n35 --> n36 n36 --> n26 n37 --> n38 n38 --> n39 n39 -->|Yes| n40 n39 -->|No| n47 n40 -->|Yes| n41 n40 -->|No| n46 n41 --> n42 n42 -->|Yes| n43 n42 -->|No| n45 n43 --> n44 n44 --> n45 n45 --> n40 n46 --> n47 n47 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據分析結果應用標籤和更新狀態\n\n        Args:\n...]
    n4{if correlation_result.get('att...}
    n5{for chain in correlation_resul...}
    n6{for step in chain.get('matche...}
    n7{for finding in step.get('finding...}
    n8[vuln_id = finding.get('finding...]
    n9{if vuln_id}
    n10[manager.add_vulnerability_tag(vuln_id, 'a...]
    n11[manager.add_vulnerability_tag(vuln_id, f"cha...]
    n12[]
    n13[]
    n14[]
    n15[]
    n16[]
    n17{if root_cause_result.get('root...}
    n18{for root_cause in root_cause_result...}
    n19{for vuln_id in root_cause.get('v...}
    n20[manager.add_vulnerability_tag(vuln_id, 'r...]
    n21[manager.add_vulnerability_tag(vuln_id, f"com...]
    n22[]
    n23[]
    n24[]
    n25{if sast_dast_result.get('confi...}
    n26{for flow in sast_dast_result[...}
    n27[sast_id = flow.get('sast_findi...]
    n28[dast_id = flow.get('dast_findi...]
    n29{if sast_id}
    n30[manager.add_vulnerability_tag(sast_id, 's...]
    n31[manager.add_vulnerability_tag(sast_id, 'h...]
    n32[]
    n33{if dast_id}
    n34[manager.add_vulnerability_tag(dast_id, 's...]
    n35[manager.add_vulnerability_tag(dast_id, 'h...]
    n36[]
    n37[]
    n38[]
    n39{if sast_dast_result.get('uncon...}
    n40{for unconfirmed in sast_dast_result[...}
    n41[vuln_id = unconfirmed.get('fin...]
    n42{if vuln_id}
    n43[manager.add_vulnerability_tag(vuln_id, 's...]
    n44[manager.add_vulnerability_tag(vuln_id, 'n...]
    n45[]
    n46[]
    n47[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n16
    n5 -->|Yes| n6
    n5 -->|No| n15
    n6 -->|Yes| n7
    n6 -->|No| n14
    n7 -->|Yes| n8
    n7 -->|No| n13
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n12
    n10 --> n11
    n11 --> n12
    n12 --> n7
    n13 --> n6
    n14 --> n5
    n15 --> n16
    n16 --> n17
    n17 -->|Yes| n18
    n17 -->|No| n24
    n18 -->|Yes| n19
    n18 -->|No| n23
    n19 -->|Yes| n20
    n19 -->|No| n22
    n20 --> n21
    n21 --> n19
    n22 --> n18
    n23 --> n24
    n24 --> n25
    n25 -->|Yes| n26
    n25 -->|No| n38
    n26 -->|Yes| n27
    n26 -->|No| n37
    n27 --> n28
    n28 --> n29
    n29 -->|Yes| n30
    n29 -->|No| n32
    n30 --> n31
    n31 --> n32
    n32 --> n33
    n33 -->|Yes| n34
    n33 -->|No| n36
    n34 --> n35
    n35 --> n36
    n36 --> n26
    n37 --> n38
    n38 --> n39
    n39 -->|Yes| n40
    n39 -->|No| n47
    n40 -->|Yes| n41
    n40 -->|No| n46
    n41 --> n42
    n42 -->|Yes| n43
    n42 -->|No| n45
    n43 --> n44
    n44 --> n45
    n45 --> n40
    n46 --> n47
    n47 --> n2
17. integration aiva integration examples enhanced scan integration Function count by severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['統計漏洞嚴重程度分布'] n4[counts = {'CRITICAL': 0, &am...] n5{for vuln in vulnerabilities} n6[severity = vuln.severity.upper(...] n7{if severity in counts} n8[counts[severity] += 1] n9[] n10[] n11[return counts] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n10 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n5 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['統計漏洞嚴重程度分布']
    n4[counts = {'CRITICAL': 0, &am...]
    n5{for vuln in vulnerabilities}
    n6[severity = vuln.severity.upper(...]
    n7{if severity in counts}
    n8[counts[severity] += 1]
    n9[]
    n10[]
    n11[return counts]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n10
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n5
    n10 --> n11
    n11 --> n2
18. integration aiva integration examples enhanced scan integration Function finding to dict
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['轉換 FindingPayload 為字典'] n4[return {'finding_id': findin...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['轉換 FindingPayload 為字典']
    n4[return {'finding_id': findin...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
19. integration aiva integration examples enhanced scan integration Function generate key insights
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['生成關鍵洞察'] n4[insights = []] n5{if correlation_result.get('att...} n6[chain_count = len(correlation_resu...] n7[insights.append(f'🔗 識別出 {chain_count...] n8[] n9{if root_cause_result.get('root...} n10[root_count = len(root_cause_resul...] n11[affected = len(root_cause_resul...] n12[insights.append(f'🎯 發現 {root_count&#...] n13[] n14{if sast_dast_result.get('confi...} n15[confirmed = len(sast_dast_result...] n16[rate = sast_dast_result.get...] n17[insights.append(f'✅ {confirmed}...] n18[] n19[risk_amp = correlation_result.g...] n20{if risk_amp > 1.5} n21[insights.append(f'⚠️ 漏洞相關性導致風險放大 {ri...] n22[] n23[return insights] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n13 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n18 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 -->|Yes| n21 n20 -->|No| n22 n21 --> n22 n22 --> n23 n23 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['生成關鍵洞察']
    n4[insights = []]
    n5{if correlation_result.get('att...}
    n6[chain_count = len(correlation_resu...]
    n7[insights.append(f'🔗 識別出 {chain_count...]
    n8[]
    n9{if root_cause_result.get('root...}
    n10[root_count = len(root_cause_resul...]
    n11[affected = len(root_cause_resul...]
    n12[insights.append(f'🎯 發現 {root_count&#...]
    n13[]
    n14{if sast_dast_result.get('confi...}
    n15[confirmed = len(sast_dast_result...]
    n16[rate = sast_dast_result.get...]
    n17[insights.append(f'✅ {confirmed}...]
    n18[]
    n19[risk_amp = correlation_result.g...]
    n20{if risk_amp > 1.5}
    n21[insights.append(f'⚠️ 漏洞相關性導致風險放大 {ri...]
    n22[]
    n23[return insights]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n13
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n18
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 -->|Yes| n21
    n20 -->|No| n22
    n21 --> n22
    n22 --> n23
    n23 --> n2
20. integration aiva integration examples enhanced scan integration Function generate summary
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['生成處理摘要'] n4[return {'asset': {&...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['生成處理摘要']
    n4[return {'asset': {&...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
21. integration aiva integration examples enhanced scan integration Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nAIVA 增強功能整合示例\n\n展示如何在實際掃描流程中使用新的資產與漏洞生命週期...] n4[from __future__ import annotations] n5[import asyncio] n6[from typing import Any] n7[from sqlalchemy import create_engine] n8[from sqlalchemy.orm import sessionmaker] n9[from services.aiva_common.schemas import FindingPa...] n10[from services.aiva_common.utils import get_logger] n11[from services.integration.aiva_integration.analysi...] n12[from services.integration.aiva_integration.recepti...] n13[from services.integration.aiva_integration.recepti...] n14[logger = get_logger(__name__)] n15[class EnhancedScanProcessor(...)] n16[def example_scan_workflow(...)] n17[def example_vulnerability_management(...)] n18{if __name__ == '__main__'} n19[asyncio.run(example_scan_workflow())] n20[asyncio.run(example_vulnerability_management()...] n21[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 -->|Yes| n19 n18 -->|No| n21 n19 --> n20 n20 --> n21 n21 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nAIVA 增強功能整合示例\n\n展示如何在實際掃描流程中使用新的資產與漏洞生命週期...]
    n4[from __future__ import annotations]
    n5[import asyncio]
    n6[from typing import Any]
    n7[from sqlalchemy import create_engine]
    n8[from sqlalchemy.orm import sessionmaker]
    n9[from services.aiva_common.schemas import FindingPa...]
    n10[from services.aiva_common.utils import get_logger]
    n11[from services.integration.aiva_integration.analysi...]
    n12[from services.integration.aiva_integration.recepti...]
    n13[from services.integration.aiva_integration.recepti...]
    n14[logger = get_logger(__name__)]
    n15[class EnhancedScanProcessor(...)]
    n16[def example_scan_workflow(...)]
    n17[def example_vulnerability_management(...)]
    n18{if __name__ == '__main__'}
    n19[asyncio.run(example_scan_workflow())]
    n20[asyncio.run(example_vulnerability_management(&#41...]
    n21[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 -->|Yes| n19
    n18 -->|No| n21
    n19 --> n20
    n20 --> n21
    n21 --> n2
22. integration aiva integration perf feedback scan metadata analyzer Function calculate performance score
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['計算性能分數'] n4[duration = scan_data.get('durat...] n5[targets = scan_data.get('targe...] n6{if duration == 0 or targets == 0} n7[return 0.0] n8[] n9[score = targets / max(durati...] n10[return min(score, 100.0)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['計算性能分數']
    n4[duration = scan_data.get('durat...]
    n5[targets = scan_data.get('targe...]
    n6{if duration == 0 or targets == 0}
    n7[return 0.0]
    n8[]
    n9[score = targets / max(durati...]
    n10[return min(score, 100.0)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
23. integration aiva integration perf feedback scan metadata analyzer Function analyze metadata
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['分析掃描元數據'] n4[return {'scan_duration': sca...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['分析掃描元數據']
    n4[return {'scan_duration': sca...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
24. integration aiva integration perf feedback scan metadata analyzer Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from datetime import UTC, datetime] n5[from typing import Any] n6[from services.aiva_common.utils import get_logger] n7[logger = get_logger(__name__)] n8[class ScanMetadataAnalyzer(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from datetime import UTC, datetime]
    n5[from typing import Any]
    n6[from services.aiva_common.utils import get_logger]
    n7[logger = get_logger(__name__)]
    n8[class ScanMetadataAnalyzer(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
25. integration aiva integration reporting report content generator Function get scan methodology
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取掃描方法說明'] n4[return '本次安全評估使用 AIVA 自動化漏洞評估平台進行,結合靜...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取掃描方法說明']
    n4[return '本次安全評估使用 AIVA 自動化漏洞評估平台進行,結合靜...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
26. scan init Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nAIVA Scan - 掃描模組\n\n這是 AIVA 的掃描模組包,負責目標發現、...] n4[__version__ = '1.0.0'] n5[from ..aiva_common.enums import AssetType, ScanSta...] n6[from ..aiva_common.schemas import CVEReference, CV...] n7[from .models import Asset, AssetInventoryItem, Ass...] n8[__all__ = ['AssetType', &...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nAIVA Scan - 掃描模組\n\n這是 AIVA 的掃描模組包,負責目標發現、...]
    n4[__version__ = '1.0.0']
    n5[from ..aiva_common.enums import AssetType, ScanSta...]
    n6[from ..aiva_common.schemas import CVEReference, CV...]
    n7[from .models import Asset, AssetInventoryItem, Ass...]
    n8[__all__ = ['AssetType', &...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
27. scan aiva scan init Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n1 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n1 --> n2
28. scan aiva scan authentication manager Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[self.auth = auth] n1 --> n3 n3 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[self.auth = auth]
    n1 --> n3
    n3 --> n2
29. scan aiva scan authentication manager Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from services.aiva_common.schemas import Authentic...] n5[class AuthenticationManager(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from services.aiva_common.schemas import Authentic...]
    n5[class AuthenticationManager(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
30. scan aiva scan config control center Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化配置控制中心\n\n Args:\n ...] n4[self._config = config or ScanModule...] n5[self._config_history: list[ScanModuleConfig] = &#...] n6[self._validate_config()] n7[logger.info('ConfigControlCenter initiali...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化配置控制中心\n\n        Args:\n      ...]
    n4[self._config = config or ScanModule...]
    n5[self._config_history: list[ScanModuleConfig] = &#...]
    n6[self._validate_config()]
    n7[logger.info('ConfigControlCenter initiali...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
31. scan aiva scan config control center Function dataclass to dict
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['將 dataclass 轉換為字典'] n4{if not hasattr(obj, '__datacla...} n5[return obj] n6[] n7[result = {}] n8{for field_name in obj.__dataclass_f...} n9[value = getattr(obj, field_n...] n10{if hasattr(value, '__dataclass...} n11[result[field_name] = self._dataclass_to_d...] n12[result[field_name] = value] n13[] n14[] n15[return result] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n14 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n13 n12 --> n13 n13 --> n8 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['將 dataclass 轉換為字典']
    n4{if not hasattr(obj, '__datacla...}
    n5[return obj]
    n6[]
    n7[result = {}]
    n8{for field_name in obj.__dataclass_f...}
    n9[value = getattr(obj, field_n...]
    n10{if hasattr(value, '__dataclass...}
    n11[result[field_name] = self._dataclass_to_d...]
    n12[result[field_name] = value]
    n13[]
    n14[]
    n15[return result]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n14
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n13
    n12 --> n13
    n13 --> n8
    n14 --> n15
    n15 --> n2
32. scan aiva scan config control center Function get aggressive preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['激進模式:深度、全面、高負載'] n4[return ScanModuleConfig(crawling=Craw...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['激進模式:深度、全面、高負載']
    n4[return ScanModuleConfig(crawling=Craw...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
33. scan aiva scan config control center Function get balanced preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['平衡模式:默認配置'] n4[return ScanModuleConfig()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['平衡模式:默認配置']
    n4[return ScanModuleConfig()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
34. scan aiva scan config control center Function get conservative preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['保守模式:快速、安全、低負載'] n4[return ScanModuleConfig(crawling=Craw...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['保守模式:快速、安全、低負載']
    n4[return ScanModuleConfig(crawling=Craw...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
35. scan aiva scan config control center Function get deep preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['深度模式:深度爬取、全面覆蓋'] n4[return ScanModuleConfig(crawling=Craw...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['深度模式:深度爬取、全面覆蓋']
    n4[return ScanModuleConfig(crawling=Craw...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
36. scan aiva scan config control center Function get fast preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['快速模式:高速、淺掃描'] n4[return ScanModuleConfig(crawling=Craw...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['快速模式:高速、淺掃描']
    n4[return ScanModuleConfig(crawling=Craw...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
37. scan aiva scan config control center Function get stealth preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['隱秘模式:低速、避免檢測'] n4[return ScanModuleConfig(crawling=Craw...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['隱秘模式:低速、避免檢測']
    n4[return ScanModuleConfig(crawling=Craw...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
38. scan aiva scan config control center Function save snapshot
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['保存當前配置快照'] n4[import copy] n5[snapshot = copy.deepcopy(self._...] n6[self._config_history.append(snapshot)] n7{if len(self._config_history) > 10} n8[self._config_history.pop(0)] n9[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['保存當前配置快照']
    n4[import copy]
    n5[snapshot = copy.deepcopy(self._...]
    n6[self._config_history.append(snapshot)]
    n7{if len(self._config_history) > 10}
    n8[self._config_history.pop(0)]
    n9[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n2
39. scan aiva scan config control center Function validate config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['驗證配置有效性'] n4[crawl = self._config.crawlin...] n5[perf = self._config.perform...] n6{if crawl.max_depth < 1} n7[logger.warning('max_depth < 1, set...] n8[crawl.max_depth = 1] n9[] n10{if crawl.max_pages < 1} n11[logger.warning('max_pages < 1, set...] n12[crawl.max_pages = 1] n13[] n14{if perf.max_concurrent_scans < 1} n15[logger.warning('max_concurrent_scans &...] n16[perf.max_concurrent_scans = 1] n17[] n18{if self._config.dynamic.enable...} n19[logger.warning('Dynamic scan enabled but ...] n20[self._config.dynamic.browser_pool_size = 1] n21[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n9 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n13 n11 --> n12 n12 --> n13 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n17 n15 --> n16 n16 --> n17 n17 --> n18 n18 -->|Yes| n19 n18 -->|No| n21 n19 --> n20 n20 --> n21 n21 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['驗證配置有效性']
    n4[crawl = self._config.crawlin...]
    n5[perf = self._config.perform...]
    n6{if crawl.max_depth < 1}
    n7[logger.warning('max_depth < 1, set...]
    n8[crawl.max_depth = 1]
    n9[]
    n10{if crawl.max_pages < 1}
    n11[logger.warning('max_pages < 1, set...]
    n12[crawl.max_pages = 1]
    n13[]
    n14{if perf.max_concurrent_scans < 1}
    n15[logger.warning('max_concurrent_scans &amp...]
    n16[perf.max_concurrent_scans = 1]
    n17[]
    n18{if self._config.dynamic.enable...}
    n19[logger.warning('Dynamic scan enabled but ...]
    n20[self._config.dynamic.browser_pool_size = 1]
    n21[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n13
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n17
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 -->|Yes| n19
    n18 -->|No| n21
    n19 --> n20
    n20 --> n21
    n21 --> n2
40. scan aiva scan config control center Function apply preset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 應用預設配置模板\n\n Args:\n ...] n4[self._save_snapshot()] n5[presets = {'conservative': s...] n6{if preset_name not in presets} n7[logger.warning(f'Unknown preset: {pr...] n8[return False] n9[] n10[preset_config = presets[preset_name]...] n11[self._config = preset_config] n12[self._validate_config()] n13[logger.info(f'Applied preset: {prese...] n14[return True] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        應用預設配置模板\n\n        Args:\n       ...]
    n4[self._save_snapshot()]
    n5[presets = {'conservative': s...]
    n6{if preset_name not in presets}
    n7[logger.warning(f'Unknown preset: {pr...]
    n8[return False]
    n9[]
    n10[preset_config = presets[preset_name]...]
    n11[self._config = preset_config]
    n12[self._validate_config()]
    n13[logger.info(f'Applied preset: {prese...]
    n14[return True]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n2
41. scan aiva scan config control center Function export config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['導出配置為字典'] n4[return {'crawling': self._da...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['導出配置為字典']
    n4[return {'crawling': self._da...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
42. scan aiva scan config control center Function get config summary
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取配置摘要(用於日誌輸出)'] n4[crawl = self._config.crawlin...] n5[dynamic = self._config.dynamic] n6[perf = self._config.perform...] n7[lines = ['Configuration Summ...] n8[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取配置摘要(用於日誌輸出)']
    n4[crawl = self._config.crawlin...]
    n5[dynamic = self._config.dynamic]
    n6[perf = self._config.perform...]
    n7[lines = ['Configuration Summ...]
    n8[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
43. scan aiva scan config control center Function get config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取完整配置'] n4[return self._config] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取完整配置']
    n4[return self._config]
    n1 --> n3
    n3 --> n4
    n4 --> n2
44. scan aiva scan config control center Function get crawling config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取爬蟲配置'] n4[return self._config.crawling] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取爬蟲配置']
    n4[return self._config.crawling]
    n1 --> n3
    n3 --> n4
    n4 --> n2
45. scan aiva scan config control center Function get dynamic config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取動態掃描配置'] n4[return self._config.dynamic] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取動態掃描配置']
    n4[return self._config.dynamic]
    n1 --> n3
    n3 --> n4
    n4 --> n2
46. scan aiva scan config control center Function get fingerprint config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取指紋識別配置'] n4[return self._config.fingerprint] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取指紋識別配置']
    n4[return self._config.fingerprint]
    n1 --> n3
    n3 --> n4
    n4 --> n2
47. scan aiva scan config control center Function get performance config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取性能配置'] n4[return self._config.performance] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取性能配置']
    n4[return self._config.performance]
    n1 --> n3
    n3 --> n4
    n4 --> n2
48. scan aiva scan config control center Function get reporting config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取報告配置'] n4[return self._config.reporting] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取報告配置']
    n4[return self._config.reporting]
    n1 --> n3
    n3 --> n4
    n4 --> n2
49. scan aiva scan config control center Function get security config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取安全配置'] n4[return self._config.security] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取安全配置']
    n4[return self._config.security]
    n1 --> n3
    n3 --> n4
    n4 --> n2
50. scan aiva scan config control center Function reset to defaults
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置為默認配置'] n4[self._save_snapshot()] n5[self._config = ScanModuleConfig()] n6[logger.info('Reset to default configurati...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置為默認配置']
    n4[self._save_snapshot()]
    n5[self._config = ScanModuleConfig()]
    n6[logger.info('Reset to default configurati...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
51. scan aiva scan config control center Function restore previous config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 恢復到上一個配置快照\n\n Returns:\n ...] n4{if not self._config_history} n5[logger.warning('No previous configuration...] n6[return False] n7[] n8[self._config = self._config_history...] n9[logger.info('Restored previous configurat...] n10[return True] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n7 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        恢復到上一個配置快照\n\n        Returns:\n  ...]
    n4{if not self._config_history}
    n5[logger.warning('No previous configuration...]
    n6[return False]
    n7[]
    n8[self._config = self._config_history...]
    n9[logger.info('Restored previous configurat...]
    n10[return True]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n7
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
52. scan aiva scan config control center Function update crawling config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 更新爬蟲配置\n\n Args:\n ...] n4[self._save_snapshot()] n5{for (key, value) in kwargs.items()} n6{if hasattr(self._config.crawli...} n7[setattr(self._config.crawling, key, value)] n8[logger.debug(f'Updated crawling config: &...] n9[logger.warning(f'Unknown crawling config ...] n10[] n11[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n10 n9 --> n10 n10 --> n5 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        更新爬蟲配置\n\n        Args:\n         ...]
    n4[self._save_snapshot()]
    n5{for (key, value) in kwargs.items()}
    n6{if hasattr(self._config.crawli...}
    n7[setattr(self._config.crawling, key, value)]
    n8[logger.debug(f'Updated crawling config: &...]
    n9[logger.warning(f'Unknown crawling config ...]
    n10[]
    n11[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n10
    n9 --> n10
    n10 --> n5
    n11 --> n2
53. scan aiva scan config control center Function update dynamic config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['更新動態掃描配置'] n4[self._save_snapshot()] n5{for (key, value) in kwargs.items()} n6{if hasattr(self._config.dynami...} n7[setattr(self._config.dynamic, key, value)] n8[logger.debug(f'Updated dynamic config: &#...] n9[logger.warning(f'Unknown dynamic config k...] n10[] n11[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n10 n9 --> n10 n10 --> n5 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['更新動態掃描配置']
    n4[self._save_snapshot()]
    n5{for (key, value) in kwargs.items()}
    n6{if hasattr(self._config.dynami...}
    n7[setattr(self._config.dynamic, key, value)]
    n8[logger.debug(f'Updated dynamic config: &#...]
    n9[logger.warning(f'Unknown dynamic config k...]
    n10[]
    n11[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n10
    n9 --> n10
    n10 --> n5
    n11 --> n2
54. scan aiva scan config control center Function update performance config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['更新性能配置'] n4[self._save_snapshot()] n5{for (key, value) in kwargs.items()} n6{if hasattr(self._config.perfor...} n7[setattr(self._config.performance, key, value)] n8[logger.debug(f'Updated performance config...] n9[logger.warning(f'Unknown performance conf...] n10[] n11[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n10 n9 --> n10 n10 --> n5 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['更新性能配置']
    n4[self._save_snapshot()]
    n5{for (key, value) in kwargs.items()}
    n6{if hasattr(self._config.perfor...}
    n7[setattr(self._config.performance, key, value)]
    n8[logger.debug(f'Updated performance config...]
    n9[logger.warning(f'Unknown performance conf...]
    n10[]
    n11[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n10
    n9 --> n10
    n10 --> n5
    n11 --> n2
55. scan aiva scan config control center Function update security config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['更新安全配置'] n4[self._save_snapshot()] n5{for (key, value) in kwargs.items()} n6{if hasattr(self._config.securi...} n7[setattr(self._config.security, key, value)] n8[logger.debug(f'Updated security config: &...] n9[logger.warning(f'Unknown security config ...] n10[] n11[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n10 n9 --> n10 n10 --> n5 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['更新安全配置']
    n4[self._save_snapshot()]
    n5{for (key, value) in kwargs.items()}
    n6{if hasattr(self._config.securi...}
    n7[setattr(self._config.security, key, value)]
    n8[logger.debug(f'Updated security config: &...]
    n9[logger.warning(f'Unknown security config ...]
    n10[]
    n11[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n10
    n9 --> n10
    n10 --> n5
    n11 --> n2
56. scan aiva scan config control center Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from dataclasses import dataclass, field] n5[from typing import Any] n6[from services.aiva_common.utils import get_logger] n7[logger = get_logger(__name__)] n8[class CrawlingConfig(...)] n9[class DynamicScanConfig(...)] n10[class FingerprintConfig(...)] n11[class SecurityConfig(...)] n12[class PerformanceConfig(...)] n13[class ReportingConfig(...)] n14[class ScanModuleConfig(...)] n15[class ConfigControlCenter(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from dataclasses import dataclass, field]
    n5[from typing import Any]
    n6[from services.aiva_common.utils import get_logger]
    n7[logger = get_logger(__name__)]
    n8[class CrawlingConfig(...)]
    n9[class DynamicScanConfig(...)]
    n10[class FingerprintConfig(...)]
    n11[class SecurityConfig(...)]
    n12[class PerformanceConfig(...)]
    n13[class ReportingConfig(...)]
    n14[class ScanModuleConfig(...)]
    n15[class ConfigControlCenter(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n2
57. scan aiva scan core crawling engine init Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n1 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n1 --> n2
58. scan aiva scan core crawling engine http client hi Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化 HTTP 客戶端\n\n Args:\n ...] n4[self._auth = auth] n5[self._headers = headers] n6[self._timeout = timeout] n7[self._pool_size = pool_size] n8[self._rate_limiter = RateLimiter(global_r...] n9[self._client = RetryingAsyncClient(...] n10[logger.info(f'HTTP client initialized: &#...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化 HTTP 客戶端\n\n        Args:\n   ...]
    n4[self._auth = auth]
    n5[self._headers = headers]
    n6[self._timeout = timeout]
    n7[self._pool_size = pool_size]
    n8[self._rate_limiter = RateLimiter(global_r...]
    n9[self._client = RetryingAsyncClient(...]
    n10[logger.info(f'HTTP client initialized: &#...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
59. scan aiva scan core crawling engine http client hi Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from typing import Any] n5[from urllib.parse import urlparse] n6[import httpx] n7[from services.aiva_common.utils import get_logger] n8[from services.aiva_common.utils.network import Rat...] n9[from ..authentication_manager import Authenticatio...] n10[from ..header_configuration import HeaderConfigura...] n11[logger = get_logger(__name__)] n12[class HiHttpClient(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from typing import Any]
    n5[from urllib.parse import urlparse]
    n6[import httpx]
    n7[from services.aiva_common.utils import get_logger]
    n8[from services.aiva_common.utils.network import Rat...]
    n9[from ..authentication_manager import Authenticatio...]
    n10[from ..header_configuration import HeaderConfigura...]
    n11[logger = get_logger(__name__)]
    n12[class HiHttpClient(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n2
60. scan aiva scan core crawling engine static content parser Function extract
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[assets: list[Asset] = []] n4[forms = 0] n5{if 'text/html' in response.hea...} n6[soup = BeautifulSoup(respon...] n7[forms_list = soup.find_all('form&#...] n8{for form in forms_list} n9{if not hasattr(form, 'get'...} n10[continue] n11[] n12[action = form.get('action')] n13{if isinstance(action, str | ty...} n14[action_url = action or base_url] n15[full = urljoin(base_url, ac...] n16[continue] n17[] n18[params = []] n19[input_elements = form.find_all('input...] n20{for input_elem in input_elements} n21{if hasattr(input_elem, 'get'&...} n22[name = input_elem.get('name...] n23{if isinstance(name, str)} n24[params.append(name)] n25[] n26[] n27[] n28[assets.append(Asset(asset_id=new_id(&#...] n29[forms += 1] n30[] n31[links_list = soup.find_all('a&#39...] n32{for a in links_list} n33{if not hasattr(a, 'get')} n34[continue] n35[] n36[href = a.get('href')] n37{if isinstance(href, str)} n38[assets.append(Asset(asset_id=new_id(&#...] n39[] n40[] n41[] n42[return (assets, forms)] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n41 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n30 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n13 n13 -->|Yes| n14 n13 -->|No| n16 n14 --> n15 n15 --> n17 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 -->|Yes| n21 n20 -->|No| n27 n21 -->|Yes| n22 n21 -->|No| n26 n22 --> n23 n23 -->|Yes| n24 n23 -->|No| n25 n24 --> n25 n25 --> n26 n26 --> n20 n27 --> n28 n28 --> n29 n29 --> n8 n30 --> n31 n31 --> n32 n32 -->|Yes| n33 n32 -->|No| n40 n33 -->|Yes| n34 n33 -->|No| n35 n34 --> n35 n35 --> n36 n36 --> n37 n37 -->|Yes| n38 n37 -->|No| n39 n38 --> n39 n39 --> n32 n40 --> n41 n41 --> n42 n42 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[assets: list[Asset] = []]
    n4[forms = 0]
    n5{if 'text/html' in response.hea...}
    n6[soup = BeautifulSoup(respon...]
    n7[forms_list = soup.find_all('form&&#35...]
    n8{for form in forms_list}
    n9{if not hasattr(form, 'get'&#4...}
    n10[continue]
    n11[]
    n12[action = form.get('action')]
    n13{if isinstance(action, str | ty...}
    n14[action_url = action or base_url]
    n15[full = urljoin(base_url, ac...]
    n16[continue]
    n17[]
    n18[params = []]
    n19[input_elements = form.find_all('input...]
    n20{for input_elem in input_elements}
    n21{if hasattr(input_elem, 'get'&...}
    n22[name = input_elem.get('name...]
    n23{if isinstance(name, str)}
    n24[params.append(name)]
    n25[]
    n26[]
    n27[]
    n28[assets.append(Asset(asset_id=new_id(&&#35...]
    n29[forms += 1]
    n30[]
    n31[links_list = soup.find_all('a&#39...]
    n32{for a in links_list}
    n33{if not hasattr(a, 'get')}
    n34[continue]
    n35[]
    n36[href = a.get('href')]
    n37{if isinstance(href, str)}
    n38[assets.append(Asset(asset_id=new_id(&&#35...]
    n39[]
    n40[]
    n41[]
    n42[return (assets, forms)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n41
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n30
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 -->|Yes| n14
    n13 -->|No| n16
    n14 --> n15
    n15 --> n17
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 -->|Yes| n21
    n20 -->|No| n27
    n21 -->|Yes| n22
    n21 -->|No| n26
    n22 --> n23
    n23 -->|Yes| n24
    n23 -->|No| n25
    n24 --> n25
    n25 --> n26
    n26 --> n20
    n27 --> n28
    n28 --> n29
    n29 --> n8
    n30 --> n31
    n31 --> n32
    n32 -->|Yes| n33
    n32 -->|No| n40
    n33 -->|Yes| n34
    n33 -->|No| n35
    n34 --> n35
    n35 --> n36
    n36 --> n37
    n37 -->|Yes| n38
    n37 -->|No| n39
    n38 --> n39
    n39 --> n32
    n40 --> n41
    n41 --> n42
    n42 --> n2
61. scan aiva scan core crawling engine static content parser Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from urllib.parse import urljoin] n5[from bs4 import BeautifulSoup] n6[import httpx] n7[from services.aiva_common.schemas import Asset] n8[from services.aiva_common.utils.ids import new_id] n9[class StaticContentParser(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from urllib.parse import urljoin]
    n5[from bs4 import BeautifulSoup]
    n6[import httpx]
    n7[from services.aiva_common.schemas import Asset]
    n8[from services.aiva_common.utils.ids import new_id]
    n9[class StaticContentParser(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
62. scan aiva scan core crawling engine url queue manager Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化 URL 佇列管理器\n\n Args:\n ...] n4[self._queue: deque[tuple[str, int]] = deq...] n5[self._seen: set[str] = set()] n6[self._processed: set[str] = set()] n7[self.max_depth = max_depth] n8{for url in seeds} n9[normalized = self._normalize_url(...] n10{if normalized} n11[self._queue.append((normalized, 0))] n12[self._seen.add(normalized)] n13[logger.debug(f'Seed URL added: {norm...] n14[] n15[] n16[logger.info(f'URL queue initialized with ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n15 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n14 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n8 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化 URL 佇列管理器\n\n        Args:\n  ...]
    n4[self._queue: deque[tuple[str, int]] = deq...]
    n5[self._seen: set[str] = set()]
    n6[self._processed: set[str] = set()]
    n7[self.max_depth = max_depth]
    n8{for url in seeds}
    n9[normalized = self._normalize_url(...]
    n10{if normalized}
    n11[self._queue.append((normalized, 0))]
    n12[self._seen.add(normalized)]
    n13[logger.debug(f'Seed URL added: {norm...]
    n14[]
    n15[]
    n16[logger.info(f'URL queue initialized with ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n15
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n14
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n8
    n15 --> n16
    n16 --> n2
63. scan aiva scan core crawling engine url queue manager Function len
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['返回佇列中待處理的 URL 數量'] n4[return len(self._queue)] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['返回佇列中待處理的 URL 數量']
    n4[return len(self._queue)]
    n1 --> n3
    n3 --> n4
    n4 --> n2
64. scan aiva scan core crawling engine url queue manager Function repr
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['返回佇列的字符串表示'] n4[stats = self.get_statistics(...] n5[return f"UrlQueueManager(queued={stat...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['返回佇列的字符串表示']
    n4[stats = self.get_statistics(...]
    n5[return f"UrlQueueManager(queued={stat...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
65. scan aiva scan core crawling engine url queue manager Function normalize url
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 標準化 URL 以避免重複\n\n 處理:\n ...] n4[try] n5[parsed = urlparse(url)] n6{if not parsed.scheme or not pa...} n7[return None] n8[] n9[normalized = parsed._replace(frag...] n10[return normalized] n11[] n12[except Exception] n13[logger.warning(f"Failed to normalize URL &am...] n14[return None] n1 --> n3 n3 --> n4 n4 --> n5 n4 --> n12 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2 n12 --> n13 n13 --> n14 n14 --> n11
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        標準化 URL 以避免重複\n\n        處理:\n    ...]
    n4[try]
    n5[parsed = urlparse(url)]
    n6{if not parsed.scheme or not pa...}
    n7[return None]
    n8[]
    n9[normalized = parsed._replace(frag...]
    n10[return normalized]
    n11[]
    n12[except Exception]
    n13[logger.warning(f"Failed to normalize URL &am...]
    n14[return None]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n4 --> n12
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
    n12 --> n13
    n13 --> n14
    n14 --> n11
66. scan aiva scan core crawling engine url queue manager Function add batch
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 批量添加 URL\n\n Args:\n ...] n4[added_count = 0] n5{for url in urls} n6{if self.add(url, parent_url, d...} n7[added_count += 1] n8[] n9[] n10[logger.debug(f'Batch add: {added_cou...] n11[return added_count] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n9 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n5 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        批量添加 URL\n\n        Args:\n       ...]
    n4[added_count = 0]
    n5{for url in urls}
    n6{if self.add(url, parent_url, d...}
    n7[added_count += 1]
    n8[]
    n9[]
    n10[logger.debug(f'Batch add: {added_cou...]
    n11[return added_count]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n9
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n5
    n9 --> n10
    n10 --> n11
    n11 --> n2
67. scan aiva scan core crawling engine url queue manager Function add
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加新的 URL 到佇列\n\n Args:\n ...] n4{if parent_url and (not urlpars...} n5[url = urljoin(parent_url, ...] n6[] n7[normalized = self._normalize_url(...] n8{if not normalized} n9[return False] n10[] n11{if normalized in self._seen or...} n12[return False] n13[] n14[self._queue.append((normalized, depth))] n15[self._seen.add(normalized)] n16[logger.debug(f'URL added: {normalize...] n17[return True] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n10 n10 --> n11 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加新的 URL 到佇列\n\n        Args:\n   ...]
    n4{if parent_url and (not urlpars...}
    n5[url = urljoin(parent_url, ...]
    n6[]
    n7[normalized = self._normalize_url(...]
    n8{if not normalized}
    n9[return False]
    n10[]
    n11{if normalized in self._seen or...}
    n12[return False]
    n13[]
    n14[self._queue.append((normalized, depth))]
    n15[self._seen.add(normalized)]
    n16[logger.debug(f'URL added: {normalize...]
    n17[return True]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n10
    n10 --> n11
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n2
68. scan aiva scan core crawling engine url queue manager Function clear
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空佇列和所有追蹤集合'] n4[self._queue.clear()] n5[self._seen.clear()] n6[self._processed.clear()] n7[logger.info('URL queue cleared&#3...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空佇列和所有追蹤集合']
    n4[self._queue.clear()]
    n5[self._seen.clear()]
    n6[self._processed.clear()]
    n7[logger.info('URL queue cleared&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
69. scan aiva scan core crawling engine url queue manager Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取佇列統計信息\n\n Returns:\n ...] n4[return {'queued': len(se...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取佇列統計信息\n\n        Returns:\n    ...]
    n4[return {'queued': len(se...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
70. scan aiva scan core crawling engine url queue manager Function has next
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查佇列中是否還有待處理的 URL\n\n Retur...] n4[return bool(self._queue)] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查佇列中是否還有待處理的 URL\n\n        Retur...]
    n4[return bool(self._queue)]
    n1 --> n3
    n3 --> n4
    n4 --> n2
71. scan aiva scan core crawling engine url queue manager Function is processed
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查 URL 是否已經處理\n\n Args:\n ...] n4[normalized = self._normalize_url(...] n5[return normalized in self._processed ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查 URL 是否已經處理\n\n        Args:\n  ...]
    n4[normalized = self._normalize_url(...]
    n5[return normalized in self._processed ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
72. scan aiva scan core crawling engine url queue manager Function is seen
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查 URL 是否已經見過\n\n Args:\n ...] n4[normalized = self._normalize_url(...] n5[return normalized in self._seen if no...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查 URL 是否已經見過\n\n        Args:\n  ...]
    n4[normalized = self._normalize_url(...]
    n5[return normalized in self._seen if no...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
73. scan aiva scan core crawling engine url queue manager Function next
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取下一個要處理的 URL\n\n Returns:\...] n4{if not self._queue} n5[raise IndexError('URL queue is empty&...] n6[] n7[(url, depth) = self._queue.popleft(...] n8[self._processed.add(url)] n9[logger.debug(f'Dequeued URL: {url...] n10[return url] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取下一個要處理的 URL\n\n        Returns:\...]
    n4{if not self._queue}
    n5[raise IndexError('URL queue is empty&...]
    n6[]
    n7[(url, depth) = self._queue.popleft(...]
    n8[self._processed.add(url)]
    n9[logger.debug(f'Dequeued URL: {url&#1...]
    n10[return url]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
74. scan aiva scan core crawling engine url queue manager Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from collections import deque] n5[from urllib.parse import urljoin, urlparse] n6[from services.aiva_common.utils import get_logger] n7[logger = get_logger(__name__)] n8[class UrlQueueManager(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from collections import deque]
    n5[from urllib.parse import urljoin, urlparse]
    n6[from services.aiva_common.utils import get_logger]
    n7[logger = get_logger(__name__)]
    n8[class UrlQueueManager(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
75. scan aiva scan dynamic engine init Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nDynamic Engine Module\n\n用於處理動態內容的模組,包括:\n...] n4[from __future__ import annotations] n5[from .ajax_api_handler import AjaxApiHandler] n6[from .dynamic_content_extractor import ContentType...] n7[from .headless_browser_pool import BrowserInstance...] n8[from .js_interaction_simulator import InteractionR...] n9[__all__ = ['AjaxApiHandler', ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nDynamic Engine Module\n\n用於處理動態內容的模組,包括:\n...]
    n4[from __future__ import annotations]
    n5[from .ajax_api_handler import AjaxApiHandler]
    n6[from .dynamic_content_extractor import ContentType...]
    n7[from .headless_browser_pool import BrowserInstance...]
    n8[from .js_interaction_simulator import InteractionR...]
    n9[__all__ = ['AjaxApiHandler', ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
76. scan aiva scan dynamic engine ajax api handler Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化 AJAX/API 處理器'] n4[self.discovered_endpoints: list[dict[str, Any]...] n5[self.api_pattern_regex = re.compile(' ...] n6[logger.debug('AjaxApiHandler initialized&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化 AJAX/API 處理器']
    n4[self.discovered_endpoints: list[dict[str, Any&#93...]
    n5[self.api_pattern_regex = re.compile('&#12...]
    n6[logger.debug('AjaxApiHandler initialized&...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
77. scan aiva scan dynamic engine ajax api handler Function create api asset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 創建 API 端點資產\n\n Args:\n ...] n4[asset = Asset(asset_id=new_i...] n5[self.discovered_endpoints.append({'u...] n6[return asset] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        創建 API 端點資產\n\n        Args:\n    ...]
    n4[asset = Asset(asset_id=new_i...]
    n5[self.discovered_endpoints.append({'u...]
    n6[return asset]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
78. scan aiva scan dynamic engine ajax api handler Function is valid endpoint
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 判斷是否為有效的 API 端點\n\n Args:\n...] n4{if self.api_pattern_regex.sear...} n5[return True] n6[] n7[static_extensions = ['.css', ...] n8[parsed = urlparse(url)] n9[return not any((parsed.path.lower().e...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        判斷是否為有效的 API 端點\n\n        Args:\n...]
    n4{if self.api_pattern_regex.sear...}
    n5[return True]
    n6[]
    n7[static_extensions = ['.css', ...]
    n8[parsed = urlparse(url)]
    n9[return not any((parsed.path.lower().e...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
79. scan aiva scan dynamic engine ajax api handler Function normalize url
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 規範化 URL\n\n Args:\n ...] n4[try] n5[endpoint = re.sub('\\$\\{[^}...] n6[endpoint = re.sub('\\{[^}&#...] n7{if not endpoint.startswith(('h...} n8[endpoint = urljoin(base_url, en...] n9[] n10[parsed = urlparse(endpoint)] n11{if parsed.scheme and parsed.ne...} n12[return endpoint] n13[] n14[return None] n15[] n16[except Exception] n17[logger.warning(f'Failed to normalize URL ...] n18[return None] n1 --> n3 n3 --> n4 n4 --> n5 n4 --> n16 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 --> n11 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n2 n16 --> n17 n17 --> n18 n18 --> n15
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        規範化 URL\n\n        Args:\n        ...]
    n4[try]
    n5[endpoint = re.sub('\\$\\{[^&#125...]
    n6[endpoint = re.sub('\\{[^}&#...]
    n7{if not endpoint.startswith(('h...}
    n8[endpoint = urljoin(base_url, en...]
    n9[]
    n10[parsed = urlparse(endpoint)]
    n11{if parsed.scheme and parsed.ne...}
    n12[return endpoint]
    n13[]
    n14[return None]
    n15[]
    n16[except Exception]
    n17[logger.warning(f'Failed to normalize URL ...]
    n18[return None]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n4 --> n16
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n2
    n16 --> n17
    n17 --> n18
    n18 --> n15
80. scan aiva scan dynamic engine ajax api handler Function get discovered endpoints
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取已發現的端點列表\n\n Returns:\n ...] n4[return self.discovered_endpoints.copy...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取已發現的端點列表\n\n        Returns:\n  ...]
    n4[return self.discovered_endpoints.copy...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
81. scan aiva scan dynamic engine ajax api handler Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取統計信息\n\n Returns:\n ...] n4[stats = {'total_endpoints': ...] n5{for endpoint in self.discovered_e...} n6[source = endpoint['source']] n7[method = endpoint['method']] n8[stats['by_source'][so...] n9[stats['by_method'][me...] n10[] n11[return stats] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n10 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n5 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取統計信息\n\n        Returns:\n      ...]
    n4[stats = {'total_endpoints': ...]
    n5{for endpoint in self.discovered_e...}
    n6[source = endpoint['source']]
    n7[method = endpoint['method']]
    n8[stats['by_source'][so...]
    n9[stats['by_method'][me...]
    n10[]
    n11[return stats]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n10
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n5
    n10 --> n11
    n11 --> n2
82. scan aiva scan dynamic engine ajax api handler Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nAJAX 和 API 端點處理器\n擴展動態引擎以識別和處理 AJAX 請求和 AP...] n4[from __future__ import annotations] n5[import re] n6[from typing import Any] n7[from urllib.parse import urljoin, urlparse] n8[from services.aiva_common.schemas import Asset] n9[from services.aiva_common.utils import get_logger,...] n10[logger = get_logger(__name__)] n11[class AjaxApiHandler(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nAJAX 和 API 端點處理器\n擴展動態引擎以識別和處理 AJAX 請求和 AP...]
    n4[from __future__ import annotations]
    n5[import re]
    n6[from typing import Any]
    n7[from urllib.parse import urljoin, urlparse]
    n8[from services.aiva_common.schemas import Asset]
    n9[from services.aiva_common.utils import get_logger,...]
    n10[logger = get_logger(__name__)]
    n11[class AjaxApiHandler(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
83. scan aiva scan dynamic engine dynamic content extractor Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化動態內容提取器\n\n Args:\n ...] n4[self.config = config or Extraction...] n5[self._network_requests: list[NetworkRequest] = &#...] n6[self._extracted_contents: list[DynamicContent] = ...] n7[self._mutation_observer_script: str | None = None] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化動態內容提取器\n\n        Args:\n     ...]
    n4[self.config = config or Extraction...]
    n5[self._network_requests: list[NetworkRequest] = &#...]
    n6[self._extracted_contents: list[DynamicContent] = ...]
    n7[self._mutation_observer_script: str | None = None]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
84. scan aiva scan dynamic engine dynamic content extractor Function clear
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空已提取的內容和網絡請求'] n4[self._extracted_contents.clear()] n5[self._network_requests.clear()] n6[logger.debug('Cleared extracted contents ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空已提取的內容和網絡請求']
    n4[self._extracted_contents.clear()]
    n5[self._network_requests.clear()]
    n6[logger.debug('Cleared extracted contents ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
85. scan aiva scan dynamic engine dynamic content extractor Function convert to assets
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 將動態內容轉換為 Asset 對象\n\n Args:...] n4{if contents is None} n5[contents = self._extracted_cont...] n6[] n7[assets: list[Asset] = []] n8{for content in contents} n9[try] n10{if content.content_type == Con...} n11[params = []] n12{for input_data in content.attribute...} n13{if input_data.get('name')} n14[params.append(input_data['name&&#...] n15[] n16[] n17[asset = Asset(asset_id=conte...] n18[assets.append(asset)] n19{if content.content_type == Con...} n20[asset = Asset(asset_id=conte...] n21[assets.append(asset)] n22[] n23[] n24[] n25[except Exception] n26[logger.debug(f'Failed to convert content ...] n27[] n28[return assets] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n27 n9 --> n10 n9 --> n25 n10 -->|Yes| n11 n10 -->|No| n19 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n16 n13 -->|Yes| n14 n13 -->|No| n15 n14 --> n15 n15 --> n12 n16 --> n17 n17 --> n18 n18 --> n23 n19 -->|Yes| n20 n19 -->|No| n22 n20 --> n21 n21 --> n22 n22 --> n23 n23 --> n24 n24 --> n8 n25 --> n26 n26 --> n24 n27 --> n28 n28 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        將動態內容轉換為 Asset 對象\n\n        Args:...]
    n4{if contents is None}
    n5[contents = self._extracted_cont...]
    n6[]
    n7[assets: list[Asset] = []]
    n8{for content in contents}
    n9[try]
    n10{if content.content_type == Con...}
    n11[params = []]
    n12{for input_data in content.attribute...}
    n13{if input_data.get('name')}
    n14[params.append(input_data['name&&#...]
    n15[]
    n16[]
    n17[asset = Asset(asset_id=conte...]
    n18[assets.append(asset)]
    n19{if content.content_type == Con...}
    n20[asset = Asset(asset_id=conte...]
    n21[assets.append(asset)]
    n22[]
    n23[]
    n24[]
    n25[except Exception]
    n26[logger.debug(f'Failed to convert content ...]
    n27[]
    n28[return assets]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n27
    n9 --> n10
    n9 --> n25
    n10 -->|Yes| n11
    n10 -->|No| n19
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n16
    n13 -->|Yes| n14
    n13 -->|No| n15
    n14 --> n15
    n15 --> n12
    n16 --> n17
    n17 --> n18
    n18 --> n23
    n19 -->|Yes| n20
    n19 -->|No| n22
    n20 --> n21
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 --> n8
    n25 --> n26
    n26 --> n24
    n27 --> n28
    n28 --> n2
86. scan aiva scan dynamic engine dynamic content extractor Function get contents by type
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['按類型獲取內容'] n4[return [c for c in self._extracted_co...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['按類型獲取內容']
    n4[return [c for c in self._extracted_co...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
87. scan aiva scan dynamic engine dynamic content extractor Function get extracted contents
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取所有已提取的內容'] n4[return self._extracted_contents.copy(...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取所有已提取的內容']
    n4[return self._extracted_contents.copy(...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
88. scan aiva scan dynamic engine dynamic content extractor Function get network requests
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取所有網絡請求'] n4[return self._network_requests.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取所有網絡請求']
    n4[return self._network_requests.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
89. scan aiva scan dynamic engine dynamic content extractor Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取統計信息'] n4[type_counts: dict[str, int] = {}] n5{for content in self._extracted_c...} n6[type_name = content.content_type...] n7[type_counts[type_name] = type_counts.get(type...] n8[] n9[return {'total_contents': le...] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取統計信息']
    n4[type_counts: dict[str, int] = {}]
    n5{for content in self._extracted_c...}
    n6[type_name = content.content_type...]
    n7[type_counts[type_name] = type_counts.get(type...]
    n8[]
    n9[return {'total_contents': le...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
90. scan aiva scan dynamic engine dynamic content extractor Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import asyncio] n5[from dataclasses import dataclass, field] n6[from datetime import datetime] n7[from enum import Enum] n8[import re] n9[from typing import Any] n10[from urllib.parse import urljoin] n11[from bs4 import BeautifulSoup] n12[from services.aiva_common.schemas import Asset] n13[from services.aiva_common.utils import get_logger] n14[from services.aiva_common.utils.ids import new_id] n15[logger = get_logger(__name__)] n16[class ContentType(...)] n17[class ExtractionStrategy(...)] n18[class DynamicContent(...)] n19[class NetworkRequest(...)] n20[class ExtractionConfig(...)] n21[class DynamicContentExtractor(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 --> n21 n21 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import asyncio]
    n5[from dataclasses import dataclass, field]
    n6[from datetime import datetime]
    n7[from enum import Enum]
    n8[import re]
    n9[from typing import Any]
    n10[from urllib.parse import urljoin]
    n11[from bs4 import BeautifulSoup]
    n12[from services.aiva_common.schemas import Asset]
    n13[from services.aiva_common.utils import get_logger]
    n14[from services.aiva_common.utils.ids import new_id]
    n15[logger = get_logger(__name__)]
    n16[class ContentType(...)]
    n17[class ExtractionStrategy(...)]
    n18[class DynamicContent(...)]
    n19[class NetworkRequest(...)]
    n20[class ExtractionConfig(...)]
    n21[class DynamicContentExtractor(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 --> n2
91. scan aiva scan dynamic engine example browser pool Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nHeadlessBrowserPool 使用範例\n\n展示如何使用 Headles...] n4[from __future__ import annotations] n5[import asyncio] n6[from .headless_browser_pool import BrowserType, He...] n7[def example_basic_usage(...)] n8[def example_custom_config(...)] n9[def example_execute_callback(...)] n10[def example_multiple_pages(...)] n11[def example_browser_info(...)] n12[def example_cleanup(...)] n13[def example_error_handling(...)] n14[def main(...)] n15{if __name__ == '__main__'} n16[asyncio.run(main())] n17[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 -->|Yes| n16 n15 -->|No| n17 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nHeadlessBrowserPool 使用範例\n\n展示如何使用 Headles...]
    n4[from __future__ import annotations]
    n5[import asyncio]
    n6[from .headless_browser_pool import BrowserType, He...]
    n7[def example_basic_usage(...)]
    n8[def example_custom_config(...)]
    n9[def example_execute_callback(...)]
    n10[def example_multiple_pages(...)]
    n11[def example_browser_info(...)]
    n12[def example_cleanup(...)]
    n13[def example_error_handling(...)]
    n14[def main(...)]
    n15{if __name__ == '__main__'}
    n16[asyncio.run(main())]
    n17[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 -->|Yes| n16
    n15 -->|No| n17
    n16 --> n17
    n17 --> n2
92. scan aiva scan dynamic engine example extractor Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nDynamicContentExtractor 使用範例\n\n展示如何使用 Dyn...] n4[from __future__ import annotations] n5[import asyncio] n6[from .dynamic_content_extractor import ContentType...] n7[from .headless_browser_pool import HeadlessBrowser...] n8[def example_basic_usage(...)] n9[def example_with_browser_pool(...)] n10[def example_custom_config(...)] n11[def example_extract_by_type(...)] n12[def example_network_requests(...)] n13[def example_convert_to_assets(...)] n14[def example_after_interaction(...)] n15[def example_clear_and_reuse(...)] n16[def main(...)] n17{if __name__ == '__main__'} n18[asyncio.run(main())] n19[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 -->|Yes| n18 n17 -->|No| n19 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nDynamicContentExtractor 使用範例\n\n展示如何使用 Dyn...]
    n4[from __future__ import annotations]
    n5[import asyncio]
    n6[from .dynamic_content_extractor import ContentType...]
    n7[from .headless_browser_pool import HeadlessBrowser...]
    n8[def example_basic_usage(...)]
    n9[def example_with_browser_pool(...)]
    n10[def example_custom_config(...)]
    n11[def example_extract_by_type(...)]
    n12[def example_network_requests(...)]
    n13[def example_convert_to_assets(...)]
    n14[def example_after_interaction(...)]
    n15[def example_clear_and_reuse(...)]
    n16[def main(...)]
    n17{if __name__ == '__main__'}
    n18[asyncio.run(main())]
    n19[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 -->|Yes| n18
    n17 -->|No| n19
    n18 --> n19
    n19 --> n2
93. scan aiva scan dynamic engine example usage Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nJsInteractionSimulator 使用範例\n\n展示如何使用 JsIn...] n4[from __future__ import annotations] n5[import asyncio] n6[import logging] n7[from .js_interaction_simulator import InteractionT...] n8[logger = logging.getLogger(__...] n9[def example_basic_usage(...)] n10[def example_advanced_usage(...)] n11[def example_with_playwright(...)] n12[def example_error_handling(...)] n13[def main(...)] n14{if __name__ == '__main__'} n15[asyncio.run(main())] n16[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n16 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nJsInteractionSimulator 使用範例\n\n展示如何使用 JsIn...]
    n4[from __future__ import annotations]
    n5[import asyncio]
    n6[import logging]
    n7[from .js_interaction_simulator import InteractionT...]
    n8[logger = logging.getLogger(__...]
    n9[def example_basic_usage(...)]
    n10[def example_advanced_usage(...)]
    n11[def example_with_playwright(...)]
    n12[def example_error_handling(...)]
    n13[def main(...)]
    n14{if __name__ == '__main__'}
    n15[asyncio.run(main())]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n16
    n15 --> n16
    n16 --> n2
94. scan aiva scan dynamic engine headless browser pool Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化瀏覽器池\n\n Args:\n ...] n4[self.config = config or PoolConfig...] n5[self._browsers: dict[str, BrowserInstance] = ...] n6[self._pages: dict[str, PageInstance] = {}] n7[self._browser_semaphore = asyncio.Semaphore(se...] n8[self._playwright: Any = None] n9[self._is_initialized = False] n10[self._next_browser_id = 0] n11[self._next_page_id = 0] n12[self._lock = asyncio.Lock()] n13[self._stats = {'browsers_created&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化瀏覽器池\n\n        Args:\n        ...]
    n4[self.config = config or PoolConfig...]
    n5[self._browsers: dict[str, BrowserInstance] = &#12...]
    n6[self._pages: dict[str, PageInstance] = {}]
    n7[self._browser_semaphore = asyncio.Semaphore(se...]
    n8[self._playwright: Any = None]
    n9[self._is_initialized = False]
    n10[self._next_browser_id = 0]
    n11[self._next_page_id = 0]
    n12[self._lock = asyncio.Lock()]
    n13[self._stats = {'browsers_created&&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
95. scan aiva scan dynamic engine headless browser pool Function get browser info
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取指定瀏覽器的詳細信息'] n4[browser_instance = self._browsers.get(b...] n5{if not browser_instance} n6[return None] n7[] n8[return {'browser_id': browse...] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取指定瀏覽器的詳細信息']
    n4[browser_instance = self._browsers.get(b...]
    n5{if not browser_instance}
    n6[return None]
    n7[]
    n8[return {'browser_id': browse...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
96. scan aiva scan dynamic engine headless browser pool Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取統計信息'] n4[active_browsers = sum((1 for b in self...] n5[active_pages = sum((1 for p in self...] n6[browser_types: dict[str, int] = defaultdict(i...] n7{for browser in self._browsers.va...} n8[browser_types[browser.browser_type.value] += 1] n9[] n10[return {'initialized': self....] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n7 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取統計信息']
    n4[active_browsers = sum((1 for b in self...]
    n5[active_pages = sum((1 for p in self...]
    n6[browser_types: dict[str, int] = defaultdict(i...]
    n7{for browser in self._browsers.va...}
    n8[browser_types[browser.browser_type.value] += 1]
    n9[]
    n10[return {'initialized': self....]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n7
    n9 --> n10
    n10 --> n2
97. scan aiva scan dynamic engine headless browser pool Function list browsers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['列出所有瀏覽器實例信息'] n4[result = []] n5{for bid in self._browsers} n6[info = self.get_browser_inf...] n7{if info} n8[result.append(info)] n9[] n10[] n11[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n10 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n5 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['列出所有瀏覽器實例信息']
    n4[result = []]
    n5{for bid in self._browsers}
    n6[info = self.get_browser_inf...]
    n7{if info}
    n8[result.append(info)]
    n9[]
    n10[]
    n11[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n10
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n5
    n10 --> n11
    n11 --> n2
98. scan aiva scan dynamic engine headless browser pool Function list pages
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['列出所有頁面實例信息'] n4[pages_info = []] n5{for page_instance in self._pages.values()} n6[pages_info.append({'page_id&#...] n7[] n8[return pages_info] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n5 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['列出所有頁面實例信息']
    n4[pages_info = []]
    n5{for page_instance in self._pages.values()}
    n6[pages_info.append({'page_id&&#35...]
    n7[]
    n8[return pages_info]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n5
    n7 --> n8
    n8 --> n2
99. scan aiva scan dynamic engine headless browser pool Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import asyncio] n5[from collections import defaultdict] n6[from collections.abc import AsyncIterator] n7[from contextlib import asynccontextmanager] n8[from dataclasses import dataclass, field] n9[from datetime import datetime] n10[from enum import Enum] n11[from typing import Any] n12[from services.aiva_common.utils import get_logger] n13[logger = get_logger(__name__)] n14[class BrowserType(...)] n15[class BrowserStatus(...)] n16[class BrowserInstance(...)] n17[class PageInstance(...)] n18[class PoolConfig(...)] n19[class HeadlessBrowserPool(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import asyncio]
    n5[from collections import defaultdict]
    n6[from collections.abc import AsyncIterator]
    n7[from contextlib import asynccontextmanager]
    n8[from dataclasses import dataclass, field]
    n9[from datetime import datetime]
    n10[from enum import Enum]
    n11[from typing import Any]
    n12[from services.aiva_common.utils import get_logger]
    n13[logger = get_logger(__name__)]
    n14[class BrowserType(...)]
    n15[class BrowserStatus(...)]
    n16[class BrowserInstance(...)]
    n17[class PageInstance(...)]
    n18[class PoolConfig(...)]
    n19[class HeadlessBrowserPool(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n2
100. scan aiva scan dynamic engine js interaction simulator Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化 JS 互動模擬器\n\n Args:\n ...] n4[self.max_retry = max_retry] n5[self.default_timeout_ms = default_timeout_ms] n6[self.enable_logging = enable_logging] n7[self._event_queue: list[JsEvent] = []] n8[self._results: list[InteractionResult] = []] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化 JS 互動模擬器\n\n        Args:\n   ...]
    n4[self.max_retry = max_retry]
    n5[self.default_timeout_ms = default_timeout_ms]
    n6[self.enable_logging = enable_logging]
    n7[self._event_queue: list[JsEvent] = []]
    n8[self._results: list[InteractionResult] = []]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
101. scan aiva scan dynamic engine js interaction simulator Function get events by type
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['按類型統計事件數量'] n4[stats: dict[str, int] = {}] n5{for result in self._results} n6[event_type = result.event.event_t...] n7[stats[event_type] = stats.get(event_type...] n8[] n9[return stats] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['按類型統計事件數量']
    n4[stats: dict[str, int] = {}]
    n5{for result in self._results}
    n6[event_type = result.event.event_t...]
    n7[stats[event_type] = stats.get(event_type...]
    n8[]
    n9[return stats]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
102. scan aiva scan dynamic engine js interaction simulator Function add click
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加點擊事件'] n4[event = JsEvent(event_type=I...] n5[self.add_event(event)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加點擊事件']
    n4[event = JsEvent(event_type=I...]
    n5[self.add_event(event)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
103. scan aiva scan dynamic engine js interaction simulator Function add event
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加事件到隊列'] n4[self._event_queue.append(event)] n5{if self.enable_logging} n6[logger.debug(f'Added event to queue: ...] n7[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加事件到隊列']
    n4[self._event_queue.append(event)]
    n5{if self.enable_logging}
    n6[logger.debug(f'Added event to queue: &#12...]
    n7[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n2
104. scan aiva scan dynamic engine js interaction simulator Function add hover
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加懸停事件'] n4[event = JsEvent(event_type=I...] n5[self.add_event(event)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加懸停事件']
    n4[event = JsEvent(event_type=I...]
    n5[self.add_event(event)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
105. scan aiva scan dynamic engine js interaction simulator Function add input
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加輸入事件'] n4[event = JsEvent(event_type=I...] n5[self.add_event(event)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加輸入事件']
    n4[event = JsEvent(event_type=I...]
    n5[self.add_event(event)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
106. scan aiva scan dynamic engine js interaction simulator Function add scroll
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加滾動事件'] n4[event = JsEvent(event_type=I...] n5[self.add_event(event)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加滾動事件']
    n4[event = JsEvent(event_type=I...]
    n5[self.add_event(event)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
107. scan aiva scan dynamic engine js interaction simulator Function add submit
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['添加表單提交事件'] n4[event = JsEvent(event_type=I...] n5[self.add_event(event)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['添加表單提交事件']
    n4[event = JsEvent(event_type=I...]
    n5[self.add_event(event)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
108. scan aiva scan dynamic engine js interaction simulator Function clear queue
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空事件隊列'] n4[self._event_queue.clear()] n5{if self.enable_logging} n6[logger.debug('Event queue cleared&...] n7[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空事件隊列']
    n4[self._event_queue.clear()]
    n5{if self.enable_logging}
    n6[logger.debug('Event queue cleared&&#3...]
    n7[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n2
109. scan aiva scan dynamic engine js interaction simulator Function get results
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取所有互動結果'] n4[return self._results.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取所有互動結果']
    n4[return self._results.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
110. scan aiva scan dynamic engine js interaction simulator Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取統計信息'] n4{if not self._results} n5[return {'total_events': 0, &...] n6[] n7[successful = sum((1 for r in self...] n8[failed = len(self._results) -...] n9[avg_time = sum((r.execution_tim...] n10[return {'total_events': len&...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取統計信息']
    n4{if not self._results}
    n5[return {'total_events': 0, &...]
    n6[]
    n7[successful = sum((1 for r in self...]
    n8[failed = len(self._results) -...]
    n9[avg_time = sum((r.execution_tim...]
    n10[return {'total_events': len&...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
111. scan aiva scan dynamic engine js interaction simulator Function get success rate
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取成功率'] n4{if not self._results} n5[return 0.0] n6[] n7[successful = sum((1 for r in self...] n8[return successful / len(self._results...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取成功率']
    n4{if not self._results}
    n5[return 0.0]
    n6[]
    n7[successful = sum((1 for r in self...]
    n8[return successful / len(self._results...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
112. scan aiva scan dynamic engine js interaction simulator Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import asyncio] n5[from dataclasses import dataclass, field] n6[from enum import Enum] n7[from typing import Any] n8[from services.aiva_common.utils import get_logger] n9[logger = get_logger(__name__)] n10[class InteractionType(...)] n11[class JsEvent(...)] n12[class InteractionResult(...)] n13[class JsInteractionSimulator(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import asyncio]
    n5[from dataclasses import dataclass, field]
    n6[from enum import Enum]
    n7[from typing import Any]
    n8[from services.aiva_common.utils import get_logger]
    n9[logger = get_logger(__name__)]
    n10[class InteractionType(...)]
    n11[class JsEvent(...)]
    n12[class InteractionResult(...)]
    n13[class JsInteractionSimulator(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
113. scan aiva scan fingerprint manager Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[self.passive_fp = PassiveFingerprinter...] n4[self.merger = FingerprintMerger()] n5[self.collected_fingerprints: Fingerprints | None =...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[self.passive_fp = PassiveFingerprinter...]
    n4[self.merger = FingerprintMerger()]
    n5[self.collected_fingerprints: Fingerprints | None =...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
114. scan aiva scan fingerprint manager Function get final fingerprints
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取最終合併的指紋信息'] n4[return self.collected_fingerprints] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取最終合併的指紋信息']
    n4[return self.collected_fingerprints]
    n1 --> n3
    n3 --> n4
    n4 --> n2
115. scan aiva scan fingerprint manager Function merge
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['合併兩個指紋對象,使用類型安全的邏輯'] n4{if existing is None} n5[return new] n6[] n7[return Fingerprints(web_server=new.we...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['合併兩個指紋對象,使用類型安全的邏輯']
    n4{if existing is None}
    n5[return new]
    n6[]
    n7[return Fingerprints(web_server=new.we...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n2
116. scan aiva scan fingerprint manager Function reset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置收集器狀態'] n4[self.collected_fingerprints = None] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置收集器狀態']
    n4[self.collected_fingerprints = None]
    n1 --> n3
    n3 --> n4
    n4 --> n2
117. scan aiva scan fingerprint manager Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n指紋管理器 - 負責收集、合併和管理掃描過程中的指紋信息\n'] n4[from __future__ import annotations] n5[import httpx] n6[from services.aiva_common.schemas import Fingerpri...] n7[from .info_gatherer.passive_fingerprinter import P...] n8[class FingerprintMerger(...)] n9[class FingerprintCollector(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n指紋管理器 - 負責收集、合併和管理掃描過程中的指紋信息\n']
    n4[from __future__ import annotations]
    n5[import httpx]
    n6[from services.aiva_common.schemas import Fingerpri...]
    n7[from .info_gatherer.passive_fingerprinter import P...]
    n8[class FingerprintMerger(...)]
    n9[class FingerprintCollector(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
118. scan aiva scan header configuration Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化頭配置管理器\n\n Args:\n ...] n4[self.user_headers = user_headers or {}] n5[self._custom_user_agent = user_agent] n6[self._rotate_user_agent = rotate_user_agent] n7[self._include_default_headers = include_default_head...] n8[self._current_user_agent = user_agent or self._...] n9[logger.debug(f'HeaderConfiguration initia...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化頭配置管理器\n\n        Args:\n      ...]
    n4[self.user_headers = user_headers or {}]
    n5[self._custom_user_agent = user_agent]
    n6[self._rotate_user_agent = rotate_user_agent]
    n7[self._include_default_headers = include_default_head...]
    n8[self._current_user_agent = user_agent or self._...]
    n9[logger.debug(f'HeaderConfiguration initia...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
119. scan aiva scan header configuration Function get random user agent
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取隨機 User-Agent\n\n Returns...] n4[return random.choice(self._DEFAULT_US...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取隨機 User-Agent\n\n        Returns...]
    n4[return random.choice(self._DEFAULT_US...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
120. scan aiva scan header configuration Function add header
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加或更新一個自定義頭\n\n Args:\n ...] n4[self.user_headers[key] = value] n5[logger.debug(f'Added/updated header: ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加或更新一個自定義頭\n\n        Args:\n    ...]
    n4[self.user_headers[key] = value]
    n5[logger.debug(f'Added/updated header: &#12...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
121. scan aiva scan header configuration Function clear custom headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清除所有自定義頭'] n4[self.user_headers.clear()] n5[logger.debug('Cleared all custom headers&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清除所有自定義頭']
    n4[self.user_headers.clear()]
    n5[logger.debug('Cleared all custom headers&...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
122. scan aiva scan header configuration Function clone
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 克隆當前配置\n\n Returns:\n ...] n4[new_config = HeaderConfiguration(...] n5[return new_config] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        克隆當前配置\n\n        Returns:\n      ...]
    n4[new_config = HeaderConfiguration(...]
    n5[return new_config]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
123. scan aiva scan header configuration Function create api config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 創建 API 請求配置\n\n Args:\n ...] n4[headers = {'Accept': &&#...] n5{if api_key} n6[headers['X-API-Key'] = ap...] n7[] n8[config = cls(user_headers=hea...] n9[return config] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        創建 API 請求配置\n\n        Args:\n    ...]
    n4[headers = {'Accept': &&#...]
    n5{if api_key}
    n6[headers['X-API-Key'] = ap...]
    n7[]
    n8[config = cls(user_headers=hea...]
    n9[return config]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
124. scan aiva scan header configuration Function create minimal config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 創建最小配置(只有必要的頭)\n\n Returns:...] n4[config = cls(user_headers={},...] n5[return config] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        創建最小配置(只有必要的頭)\n\n        Returns:...]
    n4[config = cls(user_headers={},...]
    n5[return config]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
125. scan aiva scan header configuration Function create stealth config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 創建隱秘模式配置(模擬真實瀏覽器)\n\n Retur...] n4[config = cls(user_headers={'A...] n5[return config] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        創建隱秘模式配置(模擬真實瀏覽器)\n\n        Retur...]
    n4[config = cls(user_headers={'A...]
    n5[return config]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
126. scan aiva scan header configuration Function enable user agent rotation
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 啟用或禁用 User-Agent 輪換\n\n Arg...] n4[self._rotate_user_agent = enable] n5[logger.debug(f"User-Agent rotation: {&#...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        啟用或禁用 User-Agent 輪換\n\n        Arg...]
    n4[self._rotate_user_agent = enable]
    n5[logger.debug(f"User-Agent rotation: {&#...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
127. scan aiva scan header configuration Function from dict
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 從字典創建配置\n\n Args:\n ...] n4[return cls(user_headers=config_dict.g...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        從字典創建配置\n\n        Args:\n        ...]
    n4[return cls(user_headers=config_dict.g...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
128. scan aiva scan header configuration Function get custom headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取用戶自定義的頭'] n4[return self.user_headers.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取用戶自定義的頭']
    n4[return self.user_headers.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
129. scan aiva scan header configuration Function get default headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取默認的系統頭'] n4[return cls._DEFAULT_HEADERS.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取默認的系統頭']
    n4[return cls._DEFAULT_HEADERS.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
130. scan aiva scan header configuration Function get default user agents
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取所有默認的 User-Agent 列表'] n4[return cls._DEFAULT_USER_AGENTS.copy(...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取所有默認的 User-Agent 列表']
    n4[return cls._DEFAULT_USER_AGENTS.copy(...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
131. scan aiva scan header configuration Function get headers for api
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取適合 API 請求的頭\n\n Returns:\...] n4[headers = {'Accept': &&#...] n5[headers.update(self.user_headers)] n6[return headers] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取適合 API 請求的頭\n\n        Returns:\...]
    n4[headers = {'Accept': &&#...]
    n5[headers.update(self.user_headers)]
    n6[return headers]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
132. scan aiva scan header configuration Function get headers summary
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取頭配置摘要\n\n Returns:\n ...] n4[lines = ['Header Configurati...] n5{if self.user_headers} n6[lines.append(' Custom Header Keys:&&...] n7{for key in list(self.user_he...} n8[lines.append(f' - {key}&...] n9[] n10{if len(self.user_headers) > 10} n11[lines.append(f' ... and {len(...] n12[] n13[] n14[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n13 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n7 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取頭配置摘要\n\n        Returns:\n     ...]
    n4[lines = ['Header Configurati...]
    n5{if self.user_headers}
    n6[lines.append('  Custom Header Keys:&&...]
    n7{for key in list(self.user_he...}
    n8[lines.append(f'    - {key}&...]
    n9[]
    n10{if len(self.user_headers) > 10}
    n11[lines.append(f'    ... and {len(...]
    n12[]
    n13[]
    n14[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n13
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n7
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n2
133. scan aiva scan header configuration Function get headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取組裝後的 HTTP 頭\n\n Args:\n ...] n4[headers = {}] n5{if self._include_default_headers} n6[headers.update(self._DEFAULT_HEADERS)] n7[] n8{if self._rotate_user_agent} n9[self._current_user_agent = self._get_random_use...] n10[] n11[headers['User-Agent'] = s...] n12{if for_json} n13[headers['Content-Type'] =...] n14[headers['Accept'] = &...] n15[] n16[headers.update(self.user_headers)] n17[return headers] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n10 n10 --> n11 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n15 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取組裝後的 HTTP 頭\n\n        Args:\n  ...]
    n4[headers = {}]
    n5{if self._include_default_headers}
    n6[headers.update(self._DEFAULT_HEADERS)]
    n7[]
    n8{if self._rotate_user_agent}
    n9[self._current_user_agent = self._get_random_use...]
    n10[]
    n11[headers['User-Agent'] = s...]
    n12{if for_json}
    n13[headers['Content-Type'] =...]
    n14[headers['Accept'] = &...]
    n15[]
    n16[headers.update(self.user_headers)]
    n17[return headers]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n15
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n2
134. scan aiva scan header configuration Function get user agent
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取當前的 User-Agent'] n4[return self._current_user_agent] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取當前的 User-Agent']
    n4[return self._current_user_agent]
    n1 --> n3
    n3 --> n4
    n4 --> n2
135. scan aiva scan header configuration Function merge headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 合併額外的頭\n\n Args:\n ...] n4[self.user_headers.update(additional_headers)] n5[logger.debug(f'Merged {len(addit...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        合併額外的頭\n\n        Args:\n         ...]
    n4[self.user_headers.update(additional_headers)]
    n5[logger.debug(f'Merged {len(addit...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
136. scan aiva scan header configuration Function remove header
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 移除一個自定義頭\n\n Args:\n ...] n4{if key in self.user_headers} n5[del self.user_headers[key]] n6[logger.debug(f'Removed header: {key&...] n7[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n7 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        移除一個自定義頭\n\n        Args:\n       ...]
    n4{if key in self.user_headers}
    n5[del self.user_headers[key]]
    n6[logger.debug(f'Removed header: {key&...]
    n7[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n7
    n5 --> n6
    n6 --> n7
    n7 --> n2
137. scan aiva scan header configuration Function set authorization
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置 Authorization 頭\n\n Args...] n4[self.add_header('Authorization&#3...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置 Authorization 頭\n\n        Args...]
    n4[self.add_header('Authorization&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
138. scan aiva scan header configuration Function set cookie
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置 Cookie 頭\n\n Args:\n ...] n4[self.add_header('Cookie', coo...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置 Cookie 頭\n\n        Args:\n    ...]
    n4[self.add_header('Cookie', coo...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
139. scan aiva scan header configuration Function set referer
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置 Referer 頭\n\n Args:\n ...] n4[self.add_header('Referer', re...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置 Referer 頭\n\n        Args:\n   ...]
    n4[self.add_header('Referer', re...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
140. scan aiva scan header configuration Function set user agent
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置自定義 User-Agent\n\n Args:\...] n4[self._custom_user_agent = user_agent] n5[self._current_user_agent = user_agent] n6[logger.debug(f'Set custom User-Agent: ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置自定義 User-Agent\n\n        Args:\...]
    n4[self._custom_user_agent = user_agent]
    n5[self._current_user_agent = user_agent]
    n6[logger.debug(f'Set custom User-Agent: &#1...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
141. scan aiva scan header configuration Function to dict
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 將配置轉換為字典\n\n Returns:\n ...] n4[return {'user_headers': self...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        將配置轉換為字典\n\n        Returns:\n    ...]
    n4[return {'user_headers': self...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
142. scan aiva scan header configuration Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import random] n5[from typing import Any] n6[from services.aiva_common.utils import get_logger] n7[logger = get_logger(__name__)] n8[class HeaderConfiguration(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import random]
    n5[from typing import Any]
    n6[from services.aiva_common.utils import get_logger]
    n7[logger = get_logger(__name__)]
    n8[class HeaderConfiguration(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
143. scan aiva scan info gatherer init Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n1 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n1 --> n2
144. scan aiva scan info gatherer javascript source analyzer Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化分析器'] n4[self._sink_patterns = self._build_sink_pat...] n5[self._source_patterns = self._build_source_p...] n6[self._security_patterns = self._build_security...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化分析器']
    n4[self._sink_patterns = self._build_sink_pat...]
    n5[self._source_patterns = self._build_source_p...]
    n6[self._security_patterns = self._build_security...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
145. scan aiva scan info gatherer javascript source analyzer Function analyze dataflow
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 分析數據流(簡化版)\n\n 檢測用戶輸入源是否流向危...] n4[source_lines = {p.line_number for p...] n5{for sink in result.sinks} n6[nearby_sources = [line for line in so...] n7{if nearby_sources} n8[sink.tainted_source = f'Potential taint fr...] n9{if sink.severity == Severity.HIGH} n10[sink.severity = Severity.HIGH] n11[] n12[] n13[] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n13 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n5 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        分析數據流(簡化版)\n\n        檢測用戶輸入源是否流向危...]
    n4[source_lines = {p.line_number for p...]
    n5{for sink in result.sinks}
    n6[nearby_sources = [line for line in so...]
    n7{if nearby_sources}
    n8[sink.tainted_source = f'Potential taint fr...]
    n9{if sink.severity == Severity.HIGH}
    n10[sink.severity = Severity.HIGH]
    n11[]
    n12[]
    n13[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n13
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n5
    n13 --> n2
146. scan aiva scan info gatherer javascript source analyzer Function build security patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['構建安全問題檢測模式'] n4[return {PatternType.API_KEY: {'patt...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['構建安全問題檢測模式']
    n4[return {PatternType.API_KEY: {'patt...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
147. scan aiva scan info gatherer javascript source analyzer Function build sink patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['構建 sink 檢測模式'] n4[return {SinkType.INNER_HTML: {'patt...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['構建 sink 檢測模式']
    n4[return {SinkType.INNER_HTML: {'patt...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
148. scan aiva scan info gatherer javascript source analyzer Function build source patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['構建輸入源檢測模式'] n4[return {PatternType.URL_PARAMETER: {&#3...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['構建輸入源檢測模式']
    n4[return {PatternType.URL_PARAMETER: {&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
149. scan aiva scan info gatherer javascript source analyzer Function count by type
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['按類型統計'] n4[counts: dict[str, int] = {}] n5{for item in items} n6{if isinstance(item, SinkMatch)} n7[key = item.sink_type.value] n8[key = item.pattern_type.va...] n9[] n10[counts[key] = counts.get(key, 0) +...] n11[] n12[return counts] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n9 n8 --> n9 n9 --> n10 n10 --> n5 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['按類型統計']
    n4[counts: dict[str, int] = {}]
    n5{for item in items}
    n6{if isinstance(item, SinkMatch)}
    n7[key = item.sink_type.value]
    n8[key = item.pattern_type.va...]
    n9[]
    n10[counts[key] = counts.get(key, 0) +...]
    n11[]
    n12[return counts]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n9
    n8 --> n9
    n9 --> n10
    n10 --> n5
    n11 --> n12
    n12 --> n2
150. scan aiva scan info gatherer javascript source analyzer Function detect patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['檢測可疑模式'] n4[patterns: list[PatternMatch] = []] n5{for (line_num, line) in enumerate(lines, ...} n6[stripped = line.strip()] n7{if not stripped or stripped.st...} n8[continue] n9[] n10{for (source_type, pattern_info) in self._source_p...} n11[pattern = pattern_info['patter...] n12[severity = pattern_info['severi...] n13[description = pattern_info['descri...] n14[match = re.search(pattern, l...] n15{if match} n16[patterns.append(PatternMatch(pattern_type=source_...] n17[] n18[] n19{for (security_type, pattern_info) in self._securi...} n20[pattern = pattern_info['patter...] n21[severity = pattern_info['severi...] n22[description = pattern_info['descri...] n23[match = re.search(pattern, l...] n24{if match} n25[patterns.append(PatternMatch(pattern_type=securit...] n26[] n27[] n28[] n29[return patterns] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n28 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n18 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 -->|Yes| n16 n15 -->|No| n17 n16 --> n17 n17 --> n10 n18 --> n19 n19 -->|Yes| n20 n19 -->|No| n27 n20 --> n21 n21 --> n22 n22 --> n23 n23 --> n24 n24 -->|Yes| n25 n24 -->|No| n26 n25 --> n26 n26 --> n19 n27 --> n5 n28 --> n29 n29 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['檢測可疑模式']
    n4[patterns: list[PatternMatch] = []]
    n5{for (line_num, line) in enumerate(lines, ...}
    n6[stripped = line.strip()]
    n7{if not stripped or stripped.st...}
    n8[continue]
    n9[]
    n10{for (source_type, pattern_info) in self._source_p...}
    n11[pattern = pattern_info['patter...]
    n12[severity = pattern_info['severi...]
    n13[description = pattern_info['descri...]
    n14[match = re.search(pattern, l...]
    n15{if match}
    n16[patterns.append(PatternMatch(pattern_type=source_...]
    n17[]
    n18[]
    n19{for (security_type, pattern_info) in self._securi...}
    n20[pattern = pattern_info['patter...]
    n21[severity = pattern_info['severi...]
    n22[description = pattern_info['descri...]
    n23[match = re.search(pattern, l...]
    n24{if match}
    n25[patterns.append(PatternMatch(pattern_type=securit...]
    n26[]
    n27[]
    n28[]
    n29[return patterns]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n28
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n18
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 -->|Yes| n16
    n15 -->|No| n17
    n16 --> n17
    n17 --> n10
    n18 --> n19
    n19 -->|Yes| n20
    n19 -->|No| n27
    n20 --> n21
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 -->|Yes| n25
    n24 -->|No| n26
    n25 --> n26
    n26 --> n19
    n27 --> n5
    n28 --> n29
    n29 --> n2
151. scan aiva scan info gatherer javascript source analyzer Function detect sinks
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['檢測危險 sinks'] n4[sinks: list[SinkMatch] = []] n5{for (line_num, line) in enumerate(lines, ...} n6[stripped = line.strip()] n7{if not stripped or stripped.st...} n8[continue] n9[] n10{for (sink_type, pattern_info) in self._sink_patte...} n11[pattern = pattern_info['patter...] n12[severity = pattern_info['severi...] n13[description = pattern_info['descri...] n14{if re.search(pattern, line, re...} n15[context = self._extract_contex...] n16[sinks.append(SinkMatch(sink_type=sink_type, line_...] n17[] n18[] n19[] n20[return sinks] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n19 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n18 n11 --> n12 n12 --> n13 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n17 n15 --> n16 n16 --> n17 n17 --> n10 n18 --> n5 n19 --> n20 n20 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['檢測危險 sinks']
    n4[sinks: list[SinkMatch] = []]
    n5{for (line_num, line) in enumerate(lines, ...}
    n6[stripped = line.strip()]
    n7{if not stripped or stripped.st...}
    n8[continue]
    n9[]
    n10{for (sink_type, pattern_info) in self._sink_patte...}
    n11[pattern = pattern_info['patter...]
    n12[severity = pattern_info['severi...]
    n13[description = pattern_info['descri...]
    n14{if re.search(pattern, line, re...}
    n15[context = self._extract_contex...]
    n16[sinks.append(SinkMatch(sink_type=sink_type, line_...]
    n17[]
    n18[]
    n19[]
    n20[return sinks]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n19
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n18
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n17
    n15 --> n16
    n16 --> n17
    n17 --> n10
    n18 --> n5
    n19 --> n20
    n20 --> n2
152. scan aiva scan info gatherer javascript source analyzer Function extract context
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['提取代碼上下文'] n4[start = max(0, line_num - wi...] n5[end = min(len(lines), line...] n6[context_lines = lines[start:end]] n7[return '\n'.join((f&&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['提取代碼上下文']
    n4[start = max(0, line_num - wi...]
    n5[end = min(len(lines), line...]
    n6[context_lines = lines[start:end]]
    n7[return '\n'.join((f&&...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
153. scan aiva scan info gatherer javascript source analyzer Function analyze
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 分析 JavaScript 源碼\n\n Args:\...] n4[result = AnalysisResult(url=u...] n5{if not source_code or not sour...} n6[logger.debug('Empty source code provided&...] n7[return result] n8[] n9[lines = source_code.split('\...] n10[result.total_lines = len(lines)] n11[result.sinks = self._detect_sinks(l...] n12[result.patterns = self._detect_pattern...] n13[self._analyze_dataflow(lines, result)] n14[logger.info(f'Analysis complete: {le...] n15[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        分析 JavaScript 源碼\n\n        Args:\...]
    n4[result = AnalysisResult(url=u...]
    n5{if not source_code or not sour...}
    n6[logger.debug('Empty source code provided&...]
    n7[return result]
    n8[]
    n9[lines = source_code.split('\...]
    n10[result.total_lines = len(lines)]
    n11[result.sinks = self._detect_sinks(l...]
    n12[result.patterns = self._detect_pattern...]
    n13[self._analyze_dataflow(lines, result)]
    n14[logger.info(f'Analysis complete: {le...]
    n15[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n2
154. scan aiva scan info gatherer javascript source analyzer Function format report
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['格式化報告'] n4[lines = []] n5[lines.append('JavaScript Source Analysis ...] n6[lines.append(f'URL: {result.url}...] n7[lines.append('=' * 60)] n8[stats = result.get_stats()] n9[lines.append('\nStatistics:'&...] n10[lines.append(f" Total Lines: {stats ...] n11[lines.append(f" Total Sinks: {stats ...] n12[lines.append(f" Total Patterns: {stats...] n13[lines.append(f" Critical Issues: {stat...] n14[lines.append(f" High Issues: {stats ...] n15{if result.sinks} n16[lines.append('\n' + &#...] n17{for sink in result.sinks} n18[lines.append(f'\n[{sink.severity...] n19[lines.append(f' Line {sink.line_num...] n20[lines.append(f' {sink.description&#...] n21{if sink.tainted_source} n22[lines.append(f' [警告] {sink...] n23[] n24[] n25[] n26{if result.patterns} n27[lines.append('\n' + &#...] n28{for pattern in result.patterns} n29{if pattern.severity in [Severi...} n30[lines.append(f'\n[{pattern.sever...] n31[lines.append(f' Line {pattern.line_...] n32[lines.append(f' {pattern.descriptio...] n33[] n34[] n35[] n36[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 -->|Yes| n16 n15 -->|No| n25 n16 --> n17 n17 -->|Yes| n18 n17 -->|No| n24 n18 --> n19 n19 --> n20 n20 --> n21 n21 -->|Yes| n22 n21 -->|No| n23 n22 --> n23 n23 --> n17 n24 --> n25 n25 --> n26 n26 -->|Yes| n27 n26 -->|No| n35 n27 --> n28 n28 -->|Yes| n29 n28 -->|No| n34 n29 -->|Yes| n30 n29 -->|No| n33 n30 --> n31 n31 --> n32 n32 --> n33 n33 --> n28 n34 --> n35 n35 --> n36 n36 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['格式化報告']
    n4[lines = []]
    n5[lines.append('JavaScript Source Analysis ...]
    n6[lines.append(f'URL: {result.url&#125...]
    n7[lines.append('=' * 60)]
    n8[stats = result.get_stats()]
    n9[lines.append('\nStatistics:'&...]
    n10[lines.append(f"  Total Lines: {stats&#9...]
    n11[lines.append(f"  Total Sinks: {stats&#9...]
    n12[lines.append(f"  Total Patterns: {stats...]
    n13[lines.append(f"  Critical Issues: {stat...]
    n14[lines.append(f"  High Issues: {stats&#9...]
    n15{if result.sinks}
    n16[lines.append('\n' + &&#35...]
    n17{for sink in result.sinks}
    n18[lines.append(f'\n[{sink.severity...]
    n19[lines.append(f'  Line {sink.line_num...]
    n20[lines.append(f'  {sink.description&#...]
    n21{if sink.tainted_source}
    n22[lines.append(f'  [警告]  {sink...]
    n23[]
    n24[]
    n25[]
    n26{if result.patterns}
    n27[lines.append('\n' + &&#35...]
    n28{for pattern in result.patterns}
    n29{if pattern.severity in [Severi...}
    n30[lines.append(f'\n[{pattern.sever...]
    n31[lines.append(f'  Line {pattern.line_...]
    n32[lines.append(f'  {pattern.descriptio...]
    n33[]
    n34[]
    n35[]
    n36[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 -->|Yes| n16
    n15 -->|No| n25
    n16 --> n17
    n17 -->|Yes| n18
    n17 -->|No| n24
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 -->|Yes| n22
    n21 -->|No| n23
    n22 --> n23
    n23 --> n17
    n24 --> n25
    n25 --> n26
    n26 -->|Yes| n27
    n26 -->|No| n35
    n27 --> n28
    n28 -->|Yes| n29
    n28 -->|No| n34
    n29 -->|Yes| n30
    n29 -->|No| n33
    n30 --> n31
    n31 --> n32
    n32 --> n33
    n33 --> n28
    n34 --> n35
    n35 --> n36
    n36 --> n2
155. scan aiva scan info gatherer javascript source analyzer Function get high risk issues
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取高風險問題'] n4[high_risk: list[SinkMatch | PatternMatch] = ...] n5{for sink in result.sinks} n6{if sink.severity in [Severity....} n7[high_risk.append(sink)] n8[] n9[] n10{for pattern in result.patterns} n11{if pattern.severity in [Severi...} n12[high_risk.append(pattern)] n13[] n14[] n15[return high_risk] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n9 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n5 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n14 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n13 n13 --> n10 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取高風險問題']
    n4[high_risk: list[SinkMatch | PatternMatch] = ...]
    n5{for sink in result.sinks}
    n6{if sink.severity in [Severity....}
    n7[high_risk.append(sink)]
    n8[]
    n9[]
    n10{for pattern in result.patterns}
    n11{if pattern.severity in [Severi...}
    n12[high_risk.append(pattern)]
    n13[]
    n14[]
    n15[return high_risk]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n9
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n5
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n14
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n13
    n13 --> n10
    n14 --> n15
    n15 --> n2
156. scan aiva scan info gatherer javascript source analyzer Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取統計信息'] n4[return {'total_sinks': len&#...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取統計信息']
    n4[return {'total_sinks': len&#...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
157. scan aiva scan info gatherer javascript source analyzer Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from dataclasses import dataclass, field] n5[from enum import Enum] n6[import re] n7[from typing import Any] n8[from services.aiva_common.enums import Severity] n9[from services.aiva_common.utils import get_logger] n10[logger = get_logger(__name__)] n11[class SinkType(...)] n12[class PatternType(...)] n13[class SinkMatch(...)] n14[class PatternMatch(...)] n15[class AnalysisResult(...)] n16[class JavaScriptSourceAnalyzer(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from dataclasses import dataclass, field]
    n5[from enum import Enum]
    n6[import re]
    n7[from typing import Any]
    n8[from services.aiva_common.enums import Severity]
    n9[from services.aiva_common.utils import get_logger]
    n10[logger = get_logger(__name__)]
    n11[class SinkType(...)]
    n12[class PatternType(...)]
    n13[class SinkMatch(...)]
    n14[class PatternMatch(...)]
    n15[class AnalysisResult(...)]
    n16[class JavaScriptSourceAnalyzer(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
158. scan aiva scan info gatherer passive fingerprinter Function from headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[lower = {k.lower(): v for k,...] n4[web_server = {'name': header...] n5[framework = {'name': headers...] n6[return Fingerprints(web_server=web_se...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[lower = {k.lower(): v for k,...]
    n4[web_server = {'name': header...]
    n5[framework = {'name': headers...]
    n6[return Fingerprints(web_server=web_se...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
159. scan aiva scan info gatherer passive fingerprinter Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from services.aiva_common.schemas import Fingerpri...] n5[class PassiveFingerprinter(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from services.aiva_common.schemas import Fingerpri...]
    n5[class PassiveFingerprinter(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
160. scan aiva scan info gatherer sensitive info detector Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化檢測器\n\n Args:\n ...] n4[self.min_severity = min_severity] n5[self._patterns = self._build_patterns...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化檢測器\n\n        Args:\n         ...]
    n4[self.min_severity = min_severity]
    n5[self._patterns = self._build_patterns...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
161. scan aiva scan info gatherer sensitive info detector Function post init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['自動設置描述和建議'] n4{if not self.description} n5[self.description = self._get_default_de...] n6[] n7{if not self.recommendation} n8[self.recommendation = self._get_default_re...] n9[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['自動設置描述和建議']
    n4{if not self.description}
    n5[self.description = self._get_default_de...]
    n6[]
    n7{if not self.recommendation}
    n8[self.recommendation = self._get_default_re...]
    n9[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n2
162. scan aiva scan info gatherer sensitive info detector Function build patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['構建檢測模式'] n4[return {SensitiveInfoType.API_KEY: {&#3...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['構建檢測模式']
    n4[return {SensitiveInfoType.API_KEY: {&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
163. scan aiva scan info gatherer sensitive info detector Function count by location
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['按位置統計'] n4[counts: dict[str, int] = {}] n5{for match in self.matches} n6[key = match.location.value] n7[counts[key] = counts.get(key, 0) +...] n8[] n9[return counts] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['按位置統計']
    n4[counts: dict[str, int] = {}]
    n5{for match in self.matches}
    n6[key = match.location.value]
    n7[counts[key] = counts.get(key, 0) +...]
    n8[]
    n9[return counts]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
164. scan aiva scan info gatherer sensitive info detector Function count by type
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['按類型統計'] n4[counts: dict[str, int] = {}] n5{for match in self.matches} n6[key = match.info_type.valu...] n7[counts[key] = counts.get(key, 0) +...] n8[] n9[return counts] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['按類型統計']
    n4[counts: dict[str, int] = {}]
    n5{for match in self.matches}
    n6[key = match.info_type.valu...]
    n7[counts[key] = counts.get(key, 0) +...]
    n8[]
    n9[return counts]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
165. scan aiva scan info gatherer sensitive info detector Function detect html comments
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['檢測 HTML 註釋中的敏感信息'] n4[matches: list[SensitiveMatch] = []] n5[comment_pattern = '<!--(.*?)--...] n6{for comment_match in re.finditer(comme...} n7[comment_text = comment_match.group(...] n8{for match in self._detect_in_t...} n9{if match.severity == Severity.LOW} n10[match.severity = Severity.MEDIUM] n11{if match.severity == Severity....} n12[match.severity = Severity.HIGH] n13[] n14[] n15[matches.append(match)] n16[] n17[] n18[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n17 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n14 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n8 n16 --> n6 n17 --> n18 n18 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['檢測 HTML 註釋中的敏感信息']
    n4[matches: list[SensitiveMatch] = []]
    n5[comment_pattern = '<!--(.*?)--...]
    n6{for comment_match in re.finditer(comme...}
    n7[comment_text = comment_match.group(...]
    n8{for match in self._detect_in_t...}
    n9{if match.severity == Severity.LOW}
    n10[match.severity = Severity.MEDIUM]
    n11{if match.severity == Severity....}
    n12[match.severity = Severity.HIGH]
    n13[]
    n14[]
    n15[matches.append(match)]
    n16[]
    n17[]
    n18[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n17
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n14
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n8
    n16 --> n6
    n17 --> n18
    n18 --> n2
166. scan aiva scan info gatherer sensitive info detector Function detect in text
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['在文本中檢測敏感信息'] n4[matches: list[SensitiveMatch] = []] n5[lines = text.split('\n')] n6{for (line_num, line) in enumerate(lines, ...} n7{for (info_type, pattern_info) in self._patterns.i...} n8[pattern = pattern_info['patter...] n9[severity = pattern_info['severi...] n10{for regex_match in re.finditer(patte...} n11[matched_value = regex_match.group(0)] n12[start = max(0, regex_match.s...] n13[end = min(len(line), regex...] n14[context = line[start:end]] n15[matches.append(SensitiveMatch(info_type=info_type...] n16[] n17[] n18[] n19[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n18 n7 -->|Yes| n8 n7 -->|No| n17 n8 --> n9 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n16 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n10 n16 --> n7 n17 --> n6 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['在文本中檢測敏感信息']
    n4[matches: list[SensitiveMatch] = []]
    n5[lines = text.split('\n')]
    n6{for (line_num, line) in enumerate(lines, ...}
    n7{for (info_type, pattern_info) in self._patterns.i...}
    n8[pattern = pattern_info['patter...]
    n9[severity = pattern_info['severi...]
    n10{for regex_match in re.finditer(patte...}
    n11[matched_value = regex_match.group(0)]
    n12[start = max(0, regex_match.s...]
    n13[end = min(len(line), regex...]
    n14[context = line[start:end]]
    n15[matches.append(SensitiveMatch(info_type=info_type...]
    n16[]
    n17[]
    n18[]
    n19[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n18
    n7 -->|Yes| n8
    n7 -->|No| n17
    n8 --> n9
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n16
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n10
    n16 --> n7
    n17 --> n6
    n18 --> n19
    n19 --> n2
167. scan aiva scan info gatherer sensitive info detector Function detect meta tags
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['檢測 meta 標籤中的敏感信息'] n4[matches: list[SensitiveMatch] = []] n5[meta_pattern = '<meta[^> ...] n6{for meta_match in re.finditer(meta_...} n7[content = meta_match.group(1)] n8{for match in self._detect_in_t...} n9[matches.append(match)] n10[] n11[] n12[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n11 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n8 n10 --> n6 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['檢測 meta 標籤中的敏感信息']
    n4[matches: list[SensitiveMatch] = []]
    n5[meta_pattern = '<meta[^>&#9...]
    n6{for meta_match in re.finditer(meta_...}
    n7[content = meta_match.group(1)]
    n8{for match in self._detect_in_t...}
    n9[matches.append(match)]
    n10[]
    n11[]
    n12[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n11
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n8
    n10 --> n6
    n11 --> n12
    n12 --> n2
168. scan aiva scan info gatherer sensitive info detector Function detect script blocks
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['檢測 <script> 標籤中的敏感信息'] n4[matches: list[SensitiveMatch] = []] n5[script_pattern = '<script[^&gt...] n6{for script_match in re.finditer(scrip...} n7[script_text = script_match.group(1...] n8{for match in self._detect_in_t...} n9[matches.append(match)] n10[] n11[] n12[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n11 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n8 n10 --> n6 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['檢測 <script> 標籤中的敏感信息']
    n4[matches: list[SensitiveMatch] = []]
    n5[script_pattern = '<script[^&gt...]
    n6{for script_match in re.finditer(scrip...}
    n7[script_text = script_match.group(1...]
    n8{for match in self._detect_in_t...}
    n9[matches.append(match)]
    n10[]
    n11[]
    n12[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n11
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n8
    n10 --> n6
    n11 --> n12
    n12 --> n2
169. scan aiva scan info gatherer sensitive info detector Function filter by severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['根據最低嚴重程度過濾匹配'] n4[severity_order = {Severity.INFORMATIO...] n5[min_level = severity_order[self....] n6[return [m for m in matches if severit...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['根據最低嚴重程度過濾匹配']
    n4[severity_order = {Severity.INFORMATIO...]
    n5[min_level = severity_order[self....]
    n6[return [m for m in matches if severit...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
170. scan aiva scan info gatherer sensitive info detector Function get default description
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取默認描述'] n4[descriptions = {SensitiveInfoType.A...] n5[return descriptions.get(self.info_typ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取默認描述']
    n4[descriptions = {SensitiveInfoType.A...]
    n5[return descriptions.get(self.info_typ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
171. scan aiva scan info gatherer sensitive info detector Function get default recommendation
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取默認建議'] n4{if self.info_type in [Sensitiv...} n5[return 'Remove credentials from clien...] n6{if self.info_type in [Sensitiv...} n7[return 'Mask or remove personal infor...] n8{if self.info_type in [Sensitiv...} n9[return 'Disable debug mode in product...] n10{if self.info_type == Sensitive...} n11[return 'Remove internal file paths fr...] n12[return 'Review and remove sensitive i...] n13[] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n16 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n15 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n14 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取默認建議']
    n4{if self.info_type in [Sensitiv...}
    n5[return 'Remove credentials from clien...]
    n6{if self.info_type in [Sensitiv...}
    n7[return 'Mask or remove personal infor...]
    n8{if self.info_type in [Sensitiv...}
    n9[return 'Disable debug mode in product...]
    n10{if self.info_type == Sensitive...}
    n11[return 'Remove internal file paths fr...]
    n12[return 'Review and remove sensitive i...]
    n13[]
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n16
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n15
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n14
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
172. scan aiva scan info gatherer sensitive info detector Function detect in headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測 HTTP 響應頭中的敏感信息\n\n Args:...] n4[result = DetectionResult(url=...] n5{if not headers} n6[return result] n7[] n8{for (header_name, header_value) in headers.items&...} n9{if header_name.lower() == 'set...} n10[result.matches.append(SensitiveMatch(info_type=Se...] n11[] n12[combined = f'{header_name}: {h...] n13{for match in self._detect_in_t...} n14[result.matches.append(match)] n15[] n16[] n17[result.matches = self._filter_by_seve...] n18[logger.info(f'Headers detection complete:...] n19[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n13 n13 -->|Yes| n14 n13 -->|No| n15 n14 --> n13 n15 --> n8 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測 HTTP 響應頭中的敏感信息\n\n        Args:...]
    n4[result = DetectionResult(url=...]
    n5{if not headers}
    n6[return result]
    n7[]
    n8{for (header_name, header_value) in headers.items&...}
    n9{if header_name.lower() == 'set...}
    n10[result.matches.append(SensitiveMatch(info_type=Se...]
    n11[]
    n12[combined = f'{header_name}: {h...]
    n13{for match in self._detect_in_t...}
    n14[result.matches.append(match)]
    n15[]
    n16[]
    n17[result.matches = self._filter_by_seve...]
    n18[logger.info(f'Headers detection complete:...]
    n19[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 -->|Yes| n14
    n13 -->|No| n15
    n14 --> n13
    n15 --> n8
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n2
173. scan aiva scan info gatherer sensitive info detector Function detect in html
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測 HTML 內容中的敏感信息\n\n Args:\...] n4[result = DetectionResult(url=...] n5{if not html_content} n6[return result] n7[] n8[result.matches.extend(self._detect_html_comments(...] n9[result.matches.extend(self._detect_script_blocks(...] n10[result.matches.extend(self._detect_meta_tags(html...] n11[result.matches.extend(self._detect_in_text(html_c...] n12[result.matches = self._filter_by_seve...] n13[logger.info(f'HTML detection complete: &#...] n14[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測 HTML 內容中的敏感信息\n\n        Args:\...]
    n4[result = DetectionResult(url=...]
    n5{if not html_content}
    n6[return result]
    n7[]
    n8[result.matches.extend(self._detect_html_comments(...]
    n9[result.matches.extend(self._detect_script_blocks(...]
    n10[result.matches.extend(self._detect_meta_tags(html...]
    n11[result.matches.extend(self._detect_in_text(html_c...]
    n12[result.matches = self._filter_by_seve...]
    n13[logger.info(f'HTML detection complete: &#...]
    n14[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n2
174. scan aiva scan info gatherer sensitive info detector Function detect in javascript
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測 JavaScript 代碼中的敏感信息\n\n ...] n4[result = DetectionResult(url=...] n5{if not js_code} n6[return result] n7[] n8[result.matches = self._detect_in_text...] n9[result.matches = self._filter_by_seve...] n10[logger.info(f'JavaScript detection comple...] n11[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測 JavaScript 代碼中的敏感信息\n\n        ...]
    n4[result = DetectionResult(url=...]
    n5{if not js_code}
    n6[return result]
    n7[]
    n8[result.matches = self._detect_in_text...]
    n9[result.matches = self._filter_by_seve...]
    n10[logger.info(f'JavaScript detection comple...]
    n11[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
175. scan aiva scan info gatherer sensitive info detector Function detect in response
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測完整的 HTTP 響應\n\n Args:\n ...] n4[result = DetectionResult(url=...] n5{if response_body} n6{if '<html' in response_bod...} n7[html_result = self.detect_in_html(...] n8[result.matches.extend(html_result.matches)] n9[body_matches = self._detect_in_text...] n10[result.matches.extend(body_matches)] n11[] n12[] n13{if headers} n14[header_result = self.detect_in_heade...] n15[result.matches.extend(header_result.matches)] n16[] n17[result.matches = self._filter_by_seve...] n18[logger.info(f'Response detection complete...] n19[return result] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n12 n6 -->|Yes| n7 n6 -->|No| n9 n7 --> n8 n8 --> n11 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 -->|Yes| n14 n13 -->|No| n16 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測完整的 HTTP 響應\n\n        Args:\n  ...]
    n4[result = DetectionResult(url=...]
    n5{if response_body}
    n6{if '<html' in response_bod...}
    n7[html_result = self.detect_in_html(...]
    n8[result.matches.extend(html_result.matches)]
    n9[body_matches = self._detect_in_text...]
    n10[result.matches.extend(body_matches)]
    n11[]
    n12[]
    n13{if headers}
    n14[header_result = self.detect_in_heade...]
    n15[result.matches.extend(header_result.matches)]
    n16[]
    n17[result.matches = self._filter_by_seve...]
    n18[logger.info(f'Response detection complete...]
    n19[return result]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n12
    n6 -->|Yes| n7
    n6 -->|No| n9
    n7 --> n8
    n8 --> n11
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 -->|Yes| n14
    n13 -->|No| n16
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n2
176. scan aiva scan info gatherer sensitive info detector Function format report
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['格式化檢測報告'] n4[lines = []] n5[lines.append('Sensitive Information Detec...] n6[lines.append(f'URL: {result.url}...] n7[lines.append('=' * 70)] n8[stats = result.get_stats()] n9[lines.append('\nStatistics:'&...] n10[lines.append(f" Total Matches: {stats&...] n11[lines.append(f" Critical Issues: {stat...] n12[lines.append(f" High Issues: {stats ...] n13{if stats['matches_by_type']} n14[lines.append('\n Matches by Type:&&#...] n15{for (info_type, count) in stats['...} n16[lines.append(f' - {info_type}...] n17[] n18[] n19{if result.matches} n20[lines.append('\n' + &#...] n21[sorted_matches = sorted(result.matche...] n22{for match in sorted_matches} n23[lines.append(f'\n[{match.severit...] n24[lines.append(f' Location: {match.lo...] n25{if match.line_number} n26[lines.append(f' Line: {match.line_n...] n27[] n28[lines.append(f' Value: {match.value...] n29[lines.append(f' Context: {match.con...] n30[lines.append(f' Description: {match...] n31[lines.append(f' Recommendation: {ma...] n32[] n33[] n34[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 -->|Yes| n14 n13 -->|No| n18 n14 --> n15 n15 -->|Yes| n16 n15 -->|No| n17 n16 --> n15 n17 --> n18 n18 --> n19 n19 -->|Yes| n20 n19 -->|No| n33 n20 --> n21 n21 --> n22 n22 -->|Yes| n23 n22 -->|No| n32 n23 --> n24 n24 --> n25 n25 -->|Yes| n26 n25 -->|No| n27 n26 --> n27 n27 --> n28 n28 --> n29 n29 --> n30 n30 --> n31 n31 --> n22 n32 --> n33 n33 --> n34 n34 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['格式化檢測報告']
    n4[lines = []]
    n5[lines.append('Sensitive Information Detec...]
    n6[lines.append(f'URL: {result.url&#125...]
    n7[lines.append('=' * 70)]
    n8[stats = result.get_stats()]
    n9[lines.append('\nStatistics:'&...]
    n10[lines.append(f"  Total Matches: {stats&...]
    n11[lines.append(f"  Critical Issues: {stat...]
    n12[lines.append(f"  High Issues: {stats&#9...]
    n13{if stats['matches_by_type']}
    n14[lines.append('\n  Matches by Type:&&#...]
    n15{for (info_type, count) in stats['...}
    n16[lines.append(f'    - {info_type&#125...]
    n17[]
    n18[]
    n19{if result.matches}
    n20[lines.append('\n' + &&#35...]
    n21[sorted_matches = sorted(result.matche...]
    n22{for match in sorted_matches}
    n23[lines.append(f'\n[{match.severit...]
    n24[lines.append(f'  Location: {match.lo...]
    n25{if match.line_number}
    n26[lines.append(f'  Line: {match.line_n...]
    n27[]
    n28[lines.append(f'  Value: {match.value...]
    n29[lines.append(f'  Context: {match.con...]
    n30[lines.append(f'  Description: {match...]
    n31[lines.append(f'  Recommendation: {ma...]
    n32[]
    n33[]
    n34[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 -->|Yes| n14
    n13 -->|No| n18
    n14 --> n15
    n15 -->|Yes| n16
    n15 -->|No| n17
    n16 --> n15
    n17 --> n18
    n18 --> n19
    n19 -->|Yes| n20
    n19 -->|No| n33
    n20 --> n21
    n21 --> n22
    n22 -->|Yes| n23
    n22 -->|No| n32
    n23 --> n24
    n24 --> n25
    n25 -->|Yes| n26
    n25 -->|No| n27
    n26 --> n27
    n27 --> n28
    n28 --> n29
    n29 --> n30
    n30 --> n31
    n31 --> n22
    n32 --> n33
    n33 --> n34
    n34 --> n2
177. scan aiva scan info gatherer sensitive info detector Function get critical issues
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取關鍵問題'] n4[return [m for m in result.matches if ...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取關鍵問題']
    n4[return [m for m in result.matches if ...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
178. scan aiva scan info gatherer sensitive info detector Function get high risk issues
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取高風險問題'] n4[return [m for m in result.matches if ...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取高風險問題']
    n4[return [m for m in result.matches if ...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
179. scan aiva scan info gatherer sensitive info detector Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取統計信息'] n4[return {'total_matches': len...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取統計信息']
    n4[return {'total_matches': len...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
180. scan aiva scan info gatherer sensitive info detector Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from dataclasses import dataclass, field] n5[import re] n6[from typing import Any] n7[from services.aiva_common.enums import Location, S...] n8[from services.aiva_common.utils import get_logger] n9[logger = get_logger(__name__)] n10[class SensitiveMatch(...)] n11[class DetectionResult(...)] n12[class SensitiveInfoDetector(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from dataclasses import dataclass, field]
    n5[import re]
    n6[from typing import Any]
    n7[from services.aiva_common.enums import Location, S...]
    n8[from services.aiva_common.utils import get_logger]
    n9[logger = get_logger(__name__)]
    n10[class SensitiveMatch(...)]
    n11[class DetectionResult(...)]
    n12[class SensitiveInfoDetector(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n2
181. scan aiva scan javascript analyzer Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化 JavaScript 分析器'] n4[self.analysis_results: list[JavaScriptAnalysisResu...] n5[logger.debug('JavaScriptAnalyzer initiali...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化 JavaScript 分析器']
    n4[self.analysis_results: list[JavaScriptAnalysisResu...]
    n5[logger.debug('JavaScriptAnalyzer initiali...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
182. scan aiva scan javascript analyzer Function calculate security score
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 計算安全分數(0-100)\n\n Args:\n ...] n4[score = 100] n5[score -= len(result.dangerous_functions) * 10] n6{for leak in result.data_leaks} n7[severity = leak.get('severity&#39...] n8{if severity == 'critical'} n9[score -= 25] n10{if severity == 'high'} n11[score -= 15] n12{if severity == 'medium'} n13[score -= 10] n14[score -= 5] n15[] n16[] n17[] n18[] n19{if len(result.external_resourc...} n20[score -= 5] n21[] n22[return max(0, min(100, score))] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n18 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n17 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n16 n12 -->|Yes| n13 n12 -->|No| n14 n13 --> n15 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n6 n18 --> n19 n19 -->|Yes| n20 n19 -->|No| n21 n20 --> n21 n21 --> n22 n22 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        計算安全分數(0-100)\n\n        Args:\n  ...]
    n4[score = 100]
    n5[score -= len(result.dangerous_functions) * 10]
    n6{for leak in result.data_leaks}
    n7[severity = leak.get('severity&#39...]
    n8{if severity == 'critical'}
    n9[score -= 25]
    n10{if severity == 'high'}
    n11[score -= 15]
    n12{if severity == 'medium'}
    n13[score -= 10]
    n14[score -= 5]
    n15[]
    n16[]
    n17[]
    n18[]
    n19{if len(result.external_resourc...}
    n20[score -= 5]
    n21[]
    n22[return max(0, min(100, score))]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n18
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n17
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n16
    n12 -->|Yes| n13
    n12 -->|No| n14
    n13 --> n15
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n6
    n18 --> n19
    n19 -->|Yes| n20
    n19 -->|No| n21
    n20 --> n21
    n21 --> n22
    n22 --> n2
183. scan aiva scan javascript analyzer Function detect dangerous functions
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測危險的 JavaScript 函數調用\n\n A...] n4[dangerous_patterns = {'eval'...] n5[detected: list[str] = []] n6{for (func_name, pattern) in dangerous_pattern...} n7{if re.search(pattern, js_conte...} n8[detected.append(func_name)] n9[logger.warning(f'Dangerous function detec...] n10[] n11[] n12[return detected] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n11 n7 -->|Yes| n8 n7 -->|No| n10 n8 --> n9 n9 --> n10 n10 --> n6 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測危險的 JavaScript 函數調用\n\n        A...]
    n4[dangerous_patterns = {'eval'...]
    n5[detected: list[str] = []]
    n6{for (func_name, pattern) in dangerous_pattern...}
    n7{if re.search(pattern, js_conte...}
    n8[detected.append(func_name)]
    n9[logger.warning(f'Dangerous function detec...]
    n10[]
    n11[]
    n12[return detected]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n11
    n7 -->|Yes| n8
    n7 -->|No| n10
    n8 --> n9
    n9 --> n10
    n10 --> n6
    n11 --> n12
    n12 --> n2
184. scan aiva scan javascript analyzer Function detect data leaks
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢測可能的數據洩漏\n\n Args:\n ...] n4[leaks: list[dict[str, str]] = []] n5[console_pattern = 'console\\.(log|de...] n6[console_matches = re.finditer(console_...] n7{if any(console_matches)} n8[leaks.append({'type': &a...] n9[] n10[storage_pattern = '(localStorage|ses...] n11[storage_matches = re.finditer(storage_...] n12{if any(storage_matches)} n13[leaks.append({'type': &a...] n14[] n15[url_param_pattern = '[?&](pas...] n16[url_param_matches = re.finditer(url_para...] n17{if any(url_param_matches)} n18[leaks.append({'type': &a...] n19[] n20[hardcoded_pattern = '(password|apiKe...] n21[hardcoded_matches = re.finditer(hardcode...] n22{if any(hardcoded_matches)} n23[leaks.append({'type': &a...] n24[] n25[logger.debug(f'Detected {len(lea...] n26[return leaks] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 -->|Yes| n18 n17 -->|No| n19 n18 --> n19 n19 --> n20 n20 --> n21 n21 --> n22 n22 -->|Yes| n23 n22 -->|No| n24 n23 --> n24 n24 --> n25 n25 --> n26 n26 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢測可能的數據洩漏\n\n        Args:\n      ...]
    n4[leaks: list[dict[str, str]] = []]
    n5[console_pattern = 'console\\.(log|de...]
    n6[console_matches = re.finditer(console_...]
    n7{if any(console_matches)}
    n8[leaks.append({'type': &a...]
    n9[]
    n10[storage_pattern = '(localStorage|ses...]
    n11[storage_matches = re.finditer(storage_...]
    n12{if any(storage_matches)}
    n13[leaks.append({'type': &a...]
    n14[]
    n15[url_param_pattern = '[?&](pas...]
    n16[url_param_matches = re.finditer(url_para...]
    n17{if any(url_param_matches)}
    n18[leaks.append({'type': &a...]
    n19[]
    n20[hardcoded_pattern = '(password|apiKe...]
    n21[hardcoded_matches = re.finditer(hardcode...]
    n22{if any(hardcoded_matches)}
    n23[leaks.append({'type': &a...]
    n24[]
    n25[logger.debug(f'Detected {len(lea...]
    n26[return leaks]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 -->|Yes| n18
    n17 -->|No| n19
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 --> n22
    n22 -->|Yes| n23
    n22 -->|No| n24
    n23 --> n24
    n24 --> n25
    n25 --> n26
    n26 --> n2
185. scan aiva scan javascript analyzer Function extract external resources
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 提取 JavaScript 中引用的外部資源\n\n ...] n4[external_urls: list[str] = []] n5[url_pattern = 'https?://[^\\s\\\&#...] n6[matches = re.finditer(url_patt...] n7{for match in matches} n8[url = match.group(0)] n9{if url not in external_urls} n10[external_urls.append(url)] n11[] n12[] n13[logger.debug(f'Found {len(extern...] n14[return external_urls] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n7 n12 --> n13 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        提取 JavaScript 中引用的外部資源\n\n        ...]
    n4[external_urls: list[str] = []]
    n5[url_pattern = 'https?://[^\\s\\\&&#35...]
    n6[matches = re.finditer(url_patt...]
    n7{for match in matches}
    n8[url = match.group(0)]
    n9{if url not in external_urls}
    n10[external_urls.append(url)]
    n11[]
    n12[]
    n13[logger.debug(f'Found {len(extern...]
    n14[return external_urls]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n7
    n12 --> n13
    n13 --> n14
    n14 --> n2
186. scan aiva scan javascript analyzer Function clear results
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空所有分析結果'] n4[self.analysis_results.clear()] n5[logger.debug('Cleared all JavaScript anal...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空所有分析結果']
    n4[self.analysis_results.clear()]
    n5[logger.debug('Cleared all JavaScript anal...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
187. scan aiva scan javascript analyzer Function get all results
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取所有分析結果\n\n Returns:\n ...] n4[return self.analysis_results.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取所有分析結果\n\n        Returns:\n    ...]
    n4[return self.analysis_results.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
188. scan aiva scan javascript analyzer Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取統計信息\n\n Returns:\n ...] n4{if not self.analysis_results} n5[return {'total_files': 0, &a...] n6[] n7[total_score = sum((r.security_scor...] n8[total_dangerous = sum((len(r.dangerous...] n9[total_leaks = sum((len(r.data_leak...] n10[return {'total_files': len&#...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取統計信息\n\n        Returns:\n      ...]
    n4{if not self.analysis_results}
    n5[return {'total_files': 0, &a...]
    n6[]
    n7[total_score = sum((r.security_scor...]
    n8[total_dangerous = sum((len(r.dangerous...]
    n9[total_leaks = sum((len(r.data_leak...]
    n10[return {'total_files': len&#...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
189. scan aiva scan javascript analyzer Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nJavaScript 代碼分析器\n靜態分析 JavaScript 代碼以識別潛在的...] n4[from __future__ import annotations] n5[import re] n6[from typing import Any] n7[from services.aiva_common.schemas import JavaScrip...] n8[from services.aiva_common.utils import get_logger,...] n9[logger = get_logger(__name__)] n10[class JavaScriptAnalyzer(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nJavaScript 代碼分析器\n靜態分析 JavaScript 代碼以識別潛在的...]
    n4[from __future__ import annotations]
    n5[import re]
    n6[from typing import Any]
    n7[from services.aiva_common.schemas import JavaScrip...]
    n8[from services.aiva_common.utils import get_logger,...]
    n9[logger = get_logger(__name__)]
    n10[class JavaScriptAnalyzer(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
190. scan aiva scan scan context Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化掃描上下文\n\n Args:\n ...] n4[self.request = request] n5[self._start_time = time.time()] n6[self.assets: list[Asset] = []] n7[self.urls_found = 0] n8[self.forms_found = 0] n9[self.apis_found = 0] n10[self.pages_crawled = 0] n11[self.fingerprints: Fingerprints | None = None] n12[self.errors: list[dict[str, str]] = [...] n13[logger.debug(f'Scan context initialized f...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化掃描上下文\n\n        Args:\n       ...]
    n4[self.request = request]
    n5[self._start_time = time.time()]
    n6[self.assets: list[Asset] = []]
    n7[self.urls_found = 0]
    n8[self.forms_found = 0]
    n9[self.apis_found = 0]
    n10[self.pages_crawled = 0]
    n11[self.fingerprints: Fingerprints | None = None]
    n12[self.errors: list[dict[str, str]] = [...]
    n13[logger.debug(f'Scan context initialized f...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
191. scan aiva scan scan context Function repr
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['返回上下文的字符串表示'] n4[stats = self.get_statistics(...] n5[return f"ScanContext(scan_id={self.re...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['返回上下文的字符串表示']
    n4[stats = self.get_statistics(...]
    n5[return f"ScanContext(scan_id={self.re...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
192. scan aiva scan scan context Function add asset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加資產到收集列表\n\n Args:\n ...] n4[self.assets.append(asset)] n5[logger.debug(f'Asset added: {asset.t...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加資產到收集列表\n\n        Args:\n      ...]
    n4[self.assets.append(asset)]
    n5[logger.debug(f'Asset added: {asset.t...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
193. scan aiva scan scan context Function add error
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄錯誤信息\n\n Args:\n ...] n4[error_info = {'type': error_...] n5{if url} n6[error_info['url'] = url] n7[] n8[self.errors.append(error_info)] n9[logger.warning(f'Error recorded: {er...] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄錯誤信息\n\n        Args:\n         ...]
    n4[error_info = {'type': error_...]
    n5{if url}
    n6[error_info['url'] = url]
    n7[]
    n8[self.errors.append(error_info)]
    n9[logger.warning(f'Error recorded: {er...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
194. scan aiva scan scan context Function add forms found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的表單計數\n\n Args:\n ...] n4[self.forms_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的表單計數\n\n        Args:\n      ...]
    n4[self.forms_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
195. scan aiva scan scan context Function add js analysis result
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄 JavaScript 分析結果\n\n Args...] n4{if not hasattr(self, 'js_analy...} n5[self.js_analysis_results: list[JavaScriptAnalysisR...] n6[] n7[self.js_analysis_results.append(result)] n8[logger.debug(f'JS analysis result recorde...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄 JavaScript 分析結果\n\n        Args...]
    n4{if not hasattr(self, 'js_analy...}
    n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
    n6[]
    n7[self.js_analysis_results.append(result)]
    n8[logger.debug(f'JS analysis result recorde...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
196. scan aiva scan scan context Function add sensitive match
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄發現的敏感資料匹配\n\n Args:\n ...] n4{if not hasattr(self, 'sensitiv...} n5[self.sensitive_matches: list[SensitiveMatch] = &#...] n6[] n7[self.sensitive_matches.append(match)] n8[logger.info(f"Sensitive match recorded: ...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄發現的敏感資料匹配\n\n        Args:\n    ...]
    n4{if not hasattr(self, 'sensitiv...}
    n5[self.sensitive_matches: list[SensitiveMatch] = &#...]
    n6[]
    n7[self.sensitive_matches.append(match)]
    n8[logger.info(f"Sensitive match recorded: &#12...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
197. scan aiva scan scan context Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取當前統計信息\n\n Returns:\n ...] n4[return {'urls_found': self.u...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取當前統計信息\n\n        Returns:\n    ...]
    n4[return {'urls_found': self.u...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
198. scan aiva scan scan context Function increment apis found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的 API 計數\n\n Args:\n ...] n4[self.apis_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的 API 計數\n\n        Args:\n   ...]
    n4[self.apis_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
199. scan aiva scan scan context Function increment pages crawled
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加已爬取頁面計數\n\n Args:\n ...] n4[self.pages_crawled += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加已爬取頁面計數\n\n        Args:\n      ...]
    n4[self.pages_crawled += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
200. scan aiva scan scan context Function increment urls found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的 URL 計數\n\n Args:\n ...] n4[self.urls_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的 URL 計數\n\n        Args:\n   ...]
    n4[self.urls_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
201. scan aiva scan scan context Function reset statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置所有統計計數器'] n4[self.urls_found = 0] n5[self.forms_found = 0] n6[self.apis_found = 0] n7[self.pages_crawled = 0] n8[logger.debug('Statistics reset&#3...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置所有統計計數器']
    n4[self.urls_found = 0]
    n5[self.forms_found = 0]
    n6[self.apis_found = 0]
    n7[self.pages_crawled = 0]
    n8[logger.debug('Statistics reset&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
202. scan aiva scan scan context Function scan duration
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取掃描持續時間(秒)\n\n Returns:\n ...] n4[return int(time.time() - self._start_...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取掃描持續時間(秒)\n\n        Returns:\n ...]
    n4[return int(time.time() - self._start_...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
203. scan aiva scan scan context Function set fingerprints
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置指紋信息\n\n Args:\n ...] n4[self.fingerprints = fingerprints] n5[logger.debug('Fingerprints set&#3...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置指紋信息\n\n        Args:\n         ...]
    n4[self.fingerprints = fingerprints]
    n5[logger.debug('Fingerprints set&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
204. scan aiva scan scan context Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n'] n4[from __future__ import annotations] n5[import time] n6[from typing import TYPE_CHECKING] n7[from services.aiva_common.schemas import Asset, Fi...] n8[from services.aiva_common.utils import get_logger] n9{if TYPE_CHECKING} n10[pass] n11[] n12[logger = get_logger(__name__)] n13[class ScanContext(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n']
    n4[from __future__ import annotations]
    n5[import time]
    n6[from typing import TYPE_CHECKING]
    n7[from services.aiva_common.schemas import Asset, Fi...]
    n8[from services.aiva_common.utils import get_logger]
    n9{if TYPE_CHECKING}
    n10[pass]
    n11[]
    n12[logger = get_logger(__name__)]
    n13[class ScanContext(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
205. scan aiva scan scan orchestrator Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化掃描編排器'] n4[self.static_parser = StaticContentParser(...] n5[self.fingerprint_collector = FingerprintCollector...] n6[self.sensitive_detector = SensitiveInfoDetecto...] n7[self.js_analyzer = JavaScriptSourceAnal...] n8[self.browser_pool: HeadlessBrowserPool | None = No...] n9[self.dynamic_extractor: DynamicContentExtractor | ...] n10[logger.info('ScanOrchestrator initialized...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化掃描編排器']
    n4[self.static_parser = StaticContentParser(...]
    n5[self.fingerprint_collector = FingerprintCollector...]
    n6[self.sensitive_detector = SensitiveInfoDetecto...]
    n7[self.js_analyzer = JavaScriptSourceAnal...]
    n8[self.browser_pool: HeadlessBrowserPool | None = No...]
    n9[self.dynamic_extractor: DynamicContentExtractor | ...]
    n10[logger.info('ScanOrchestrator initialized...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
206. scan aiva scan scan orchestrator Function build scan result
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 構建掃描結果\n\n Args:\n ...] n4[summary = Summary(urls_found=c...] n5[return ScanCompletedPayload(scan_id=c...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        構建掃描結果\n\n        Args:\n         ...]
    n4[summary = Summary(urls_found=c...]
    n5[return ScanCompletedPayload(scan_id=c...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
207. scan aiva scan scan orchestrator Function reset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置編排器狀態'] n4[self.fingerprint_collector.reset()] n5[logger.info('ScanOrchestrator reset&&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置編排器狀態']
    n4[self.fingerprint_collector.reset()]
    n5[logger.info('ScanOrchestrator reset&&...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
208. scan aiva scan scan orchestrator Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n'] n4[from __future__ import annotations] n5[from typing import TYPE_CHECKING, Any] n6[from services.aiva_common.schemas import Asset, Sc...] n7[from services.aiva_common.utils import get_logger,...] n8[from .authentication_manager import Authentication...] n9[from .core_crawling_engine.http_client_hi import H...] n10[from .core_crawling_engine.static_content_parser i...] n11[from .core_crawling_engine.url_queue_manager impor...] n12[from .dynamic_engine.dynamic_content_extractor imp...] n13[from .dynamic_engine.headless_browser_pool import ...] n14[from .fingerprint_manager import FingerprintCollec...] n15[from .header_configuration import HeaderConfigurat...] n16[from .info_gatherer.javascript_source_analyzer imp...] n17[from .info_gatherer.sensitive_info_detector import...] n18[from .scan_context import ScanContext] n19[from .strategy_controller import StrategyControlle...] n20{if TYPE_CHECKING} n21[pass] n22[] n23[logger = get_logger(__name__)] n24[class ScanOrchestrator(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 -->|Yes| n21 n20 -->|No| n22 n21 --> n22 n22 --> n23 n23 --> n24 n24 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n']
    n4[from __future__ import annotations]
    n5[from typing import TYPE_CHECKING, Any]
    n6[from services.aiva_common.schemas import Asset, Sc...]
    n7[from services.aiva_common.utils import get_logger,...]
    n8[from .authentication_manager import Authentication...]
    n9[from .core_crawling_engine.http_client_hi import H...]
    n10[from .core_crawling_engine.static_content_parser i...]
    n11[from .core_crawling_engine.url_queue_manager impor...]
    n12[from .dynamic_engine.dynamic_content_extractor imp...]
    n13[from .dynamic_engine.headless_browser_pool import ...]
    n14[from .fingerprint_manager import FingerprintCollec...]
    n15[from .header_configuration import HeaderConfigurat...]
    n16[from .info_gatherer.javascript_source_analyzer imp...]
    n17[from .info_gatherer.sensitive_info_detector import...]
    n18[from .scan_context import ScanContext]
    n19[from .strategy_controller import StrategyControlle...]
    n20{if TYPE_CHECKING}
    n21[pass]
    n22[]
    n23[logger = get_logger(__name__)]
    n24[class ScanOrchestrator(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 -->|Yes| n21
    n20 -->|No| n22
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 --> n2
209. scan aiva scan schemas Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[super().__init__(**data)] n4{if not self.description} n5[self.description = self._get_default_de...] n6[] n7{if not self.recommendation} n8[self.recommendation = self._get_default_re...] n9[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[super().__init__(**data)]
    n4{if not self.description}
    n5[self.description = self._get_default_de...]
    n6[]
    n7{if not self.recommendation}
    n8[self.recommendation = self._get_default_re...]
    n9[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n2
210. scan aiva scan schemas Function get default description
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取默認描述'] n4[descriptions = {SensitiveInfoType.A...] n5[return descriptions.get(self.info_typ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取默認描述']
    n4[descriptions = {SensitiveInfoType.A...]
    n5[return descriptions.get(self.info_typ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
211. scan aiva scan schemas Function get default recommendation
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取默認建議'] n4{if self.info_type in [Sensitiv...} n5[return 'Remove credentials from clien...] n6{if self.info_type in [Sensitiv...} n7[return 'Mask or remove personal infor...] n8{if self.info_type in [Sensitiv...} n9[return 'Disable debug mode in product...] n10{if self.info_type == Sensitive...} n11[return 'Remove internal file paths fr...] n12[return f'Remove {self.info_type.value...] n13[] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n16 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n15 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n14 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取默認建議']
    n4{if self.info_type in [Sensitiv...}
    n5[return 'Remove credentials from clien...]
    n6{if self.info_type in [Sensitiv...}
    n7[return 'Mask or remove personal infor...]
    n8{if self.info_type in [Sensitiv...}
    n9[return 'Disable debug mode in product...]
    n10{if self.info_type == Sensitive...}
    n11[return 'Remove internal file paths fr...]
    n12[return f'Remove {self.info_type.value...]
    n13[]
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n16
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n15
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n14
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
212. scan aiva scan schemas Function limit list size
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['限制列表大小以防止過大的響應'] n4[max_items = 1000] n5{if len(v) > max_items} n6[raise ValueError(f'List too large (ma...] n7[] n8[return v] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['限制列表大小以防止過大的響應']
    n4[max_items = 1000]
    n5{if len(v) > max_items}
    n6[raise ValueError(f'List too large (ma...]
    n7[]
    n8[return v]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
213. scan aiva scan schemas Function limit urls
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['限制 URL 數量'] n4[max_urls = 500] n5{if len(v) > max_urls} n6[raise ValueError(f'Too many URLs (max...] n7[] n8[return v] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['限制 URL 數量']
    n4[max_urls = 500]
    n5{if len(v) > max_urls}
    n6[raise ValueError(f'Too many URLs (max...]
    n7[]
    n8[return v]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
214. scan aiva scan schemas Function validate method
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['驗證 HTTP 方法'] n4[allowed = {'GET', &#...] n5{if v.upper() not in allowed} n6[raise ValueError(f'Invalid HTTP method: &...] n7[] n8[return v.upper()] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['驗證 HTTP 方法']
    n4[allowed = {'GET', &#...]
    n5{if v.upper() not in allowed}
    n6[raise ValueError(f'Invalid HTTP method: &...]
    n7[]
    n8[return v.upper()]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
215. scan aiva scan schemas Function validate request type
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['驗證請求類型'] n4[allowed = {'xhr', &#...] n5{if v.lower() not in allowed} n6[raise ValueError(f'Invalid request_type: ...] n7[] n8[return v.lower()] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['驗證請求類型']
    n4[allowed = {'xhr', &#...]
    n5{if v.lower() not in allowed}
    n6[raise ValueError(f'Invalid request_type: ...]
    n7[]
    n8[return v.lower()]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
216. scan aiva scan schemas Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nScan 模組專用數據合約\n定義掃描引擎相關的所有數據結構,基於 Pydantic...] n4[from __future__ import annotations] n5[from typing import Any] n6[from pydantic import BaseModel, Field, field_valid...] n7[from services.aiva_common.enums import Location, S...] n8[class SensitiveMatch(...)] n9[class JavaScriptAnalysisResult(...)] n10[class NetworkRequest(...)] n11[class InteractionResult(...)] n12[class DynamicScanTask(...)] n13[class DynamicScanResult(...)] n14[__all__ = ['SensitiveInfoType&#39...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nScan 模組專用數據合約\n定義掃描引擎相關的所有數據結構,基於 Pydantic...]
    n4[from __future__ import annotations]
    n5[from typing import Any]
    n6[from pydantic import BaseModel, Field, field_valid...]
    n7[from services.aiva_common.enums import Location, S...]
    n8[class SensitiveMatch(...)]
    n9[class JavaScriptAnalysisResult(...)]
    n10[class NetworkRequest(...)]
    n11[class InteractionResult(...)]
    n12[class DynamicScanTask(...)]
    n13[class DynamicScanResult(...)]
    n14[__all__ = ['SensitiveInfoType&#39...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n2
217. scan aiva scan scope manager Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化範圍管理器\n\n Args:\n ...] n4[self.scope = scope] n5[self._allowed_hosts_set = set(scope.allowed_ho...] n6[self._exclusion_patterns = self._compile_exclus...] n7[self._stats = {'total_checked&#3...] n8[logger.info(f'ScopeManager initialized: &...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化範圍管理器\n\n        Args:\n       ...]
    n4[self.scope = scope]
    n5[self._allowed_hosts_set = set(scope.allowed_ho...]
    n6[self._exclusion_patterns = self._compile_exclus...]
    n7[self._stats = {'total_checked&#3...]
    n8[logger.info(f'ScopeManager initialized: &...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
218. scan aiva scan scope manager Function compile exclusion patterns
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 編譯排除模式為正則表達式\n\n Args:\n ...] n4[patterns = []] n5{for exclusion in exclusions} n6[try] n7[pattern = self._compile_patter...] n8[patterns.append(pattern)] n9[] n10[except re.error] n11[logger.warning(f"Invalid exclusion pattern &...] n12[] n13[return patterns] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n12 n6 --> n7 n6 --> n10 n7 --> n8 n8 --> n9 n9 --> n5 n10 --> n11 n11 --> n9 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        編譯排除模式為正則表達式\n\n        Args:\n   ...]
    n4[patterns = []]
    n5{for exclusion in exclusions}
    n6[try]
    n7[pattern = self._compile_patter...]
    n8[patterns.append(pattern)]
    n9[]
    n10[except re.error]
    n11[logger.warning(f"Invalid exclusion pattern &...]
    n12[]
    n13[return patterns]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n12
    n6 --> n7
    n6 --> n10
    n7 --> n8
    n8 --> n9
    n9 --> n5
    n10 --> n11
    n11 --> n9
    n12 --> n13
    n13 --> n2
219. scan aiva scan scope manager Function compile pattern
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 將通配符模式編譯為正則表達式\n\n 支持的模式:\n...] n4[regex = re.escape(pattern)] n5[regex = regex.replace('\\*\\...] n6[regex = regex.replace('\\*',...] n7[regex = regex.replace('DOUBL...] n8[regex = regex.replace('\\?',...] n9[regex = f'^{regex}$'] n10[return re.compile(regex, re.IGNORECAS...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        將通配符模式編譯為正則表達式\n\n        支持的模式:\n...]
    n4[regex = re.escape(pattern)]
    n5[regex = regex.replace('\\*\\...]
    n6[regex = regex.replace('\\*',...]
    n7[regex = regex.replace('DOUBL...]
    n8[regex = regex.replace('\\?',...]
    n9[regex = f'^{regex}$']
    n10[return re.compile(regex, re.IGNORECAS...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
220. scan aiva scan scope manager Function is host allowed
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查主機名是否被允許(內部方法)\n\n Args:\...] n4{if not hostname} n5[return False] n6[] n7{if not self._allowed_hosts_set} n8[return True] n9[] n10{if hostname in self._allowed_h...} n11[return True] n12[] n13{if self.scope.include_subdomains} n14{for allowed_host in self._allowed_hos...} n15{if hostname.endswith(f'.{allow...} n16[return True] n17[] n18[] n19[] n20[return False] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 -->|Yes| n11 n10 -->|No| n12 n11 --> n12 n12 --> n13 n13 -->|Yes| n14 n13 -->|No| n19 n14 -->|Yes| n15 n14 -->|No| n18 n15 -->|Yes| n16 n15 -->|No| n17 n16 --> n17 n17 --> n14 n18 --> n19 n19 --> n20 n20 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查主機名是否被允許(內部方法)\n\n        Args:\...]
    n4{if not hostname}
    n5[return False]
    n6[]
    n7{if not self._allowed_hosts_set}
    n8[return True]
    n9[]
    n10{if hostname in self._allowed_h...}
    n11[return True]
    n12[]
    n13{if self.scope.include_subdomains}
    n14{for allowed_host in self._allowed_hos...}
    n15{if hostname.endswith(f'.{allow...}
    n16[return True]
    n17[]
    n18[]
    n19[]
    n20[return False]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 -->|Yes| n11
    n10 -->|No| n12
    n11 --> n12
    n12 --> n13
    n13 -->|Yes| n14
    n13 -->|No| n19
    n14 -->|Yes| n15
    n14 -->|No| n18
    n15 -->|Yes| n16
    n15 -->|No| n17
    n16 --> n17
    n17 --> n14
    n18 --> n19
    n19 --> n20
    n20 --> n2
221. scan aiva scan scope manager Function is valid hostname
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查主機名是否有效\n\n Args:\n ...] n4{if not hostname} n5[return False] n6[] n7[pattern = '^[a-zA-Z0-9]([a-zA...] n8[return bool(re.match(pattern, hostnam...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查主機名是否有效\n\n        Args:\n      ...]
    n4{if not hostname}
    n5[return False]
    n6[]
    n7[pattern = '^[a-zA-Z0-9]([a-zA...]
    n8[return bool(re.match(pattern, hostnam...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
222. scan aiva scan scope manager Function matches exclusion
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查 URL 是否匹配任何排除模式\n\n Args:...] n4[return any((pattern.search(url) for p...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查 URL 是否匹配任何排除模式\n\n        Args:...]
    n4[return any((pattern.search(url) for p...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
223. scan aiva scan scope manager Function add allowed host
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加允許的主機\n\n Args:\n ...] n4{if hostname and hostname not i...} n5[self._allowed_hosts_set.add(hostname)] n6[self.scope.allowed_hosts.append(hostname)] n7[logger.info(f'Added allowed host: {h...] n8[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n8 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加允許的主機\n\n        Args:\n        ...]
    n4{if hostname and hostname not i...}
    n5[self._allowed_hosts_set.add(hostname)]
    n6[self.scope.allowed_hosts.append(hostname)]
    n7[logger.info(f'Added allowed host: {h...]
    n8[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n8
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
224. scan aiva scan scope manager Function add exclusion
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加排除模式\n\n Args:\n ...] n4{if pattern and pattern not in ...} n5[self.scope.exclusions.append(pattern)] n6[self._exclusion_patterns.append(self._compile_patt...] n7[logger.info(f'Added exclusion pattern: &#...] n8[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n8 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加排除模式\n\n        Args:\n         ...]
    n4{if pattern and pattern not in ...}
    n5[self.scope.exclusions.append(pattern)]
    n6[self._exclusion_patterns.append(self._compile_patt...]
    n7[logger.info(f'Added exclusion pattern: &#...]
    n8[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n8
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
225. scan aiva scan scope manager Function clone
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 克隆當前範圍管理器\n\n Returns:\n ...] n4[import copy] n5[new_scope = copy.deepcopy(self.s...] n6[return ScopeManager(new_scope)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        克隆當前範圍管理器\n\n        Returns:\n   ...]
    n4[import copy]
    n5[new_scope = copy.deepcopy(self.s...]
    n6[return ScopeManager(new_scope)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
226. scan aiva scan scope manager Function filter urls
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 過濾 URL 列表,只返回在範圍內的 URL\n\n ...] n4[return [url for url in urls if self.i...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        過濾 URL 列表,只返回在範圍內的 URL\n\n        ...]
    n4[return [url for url in urls if self.i...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
227. scan aiva scan scope manager Function get allowed hosts
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取允許的主機列表'] n4[return list(self._allowed_hosts_set)] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取允許的主機列表']
    n4[return list(self._allowed_hosts_set)]
    n1 --> n3
    n3 --> n4
    n4 --> n2
228. scan aiva scan scope manager Function get exclusions
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取排除模式列表'] n4[return self.scope.exclusions.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取排除模式列表']
    n4[return self.scope.exclusions.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
229. scan aiva scan scope manager Function get scope summary
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取範圍配置摘要\n\n Returns:\n ...] n4[allowed_hosts_display = ', '.join...] n5[lines = ['Scope Configuratio...] n6{if self.scope.exclusions} n7[lines.append(' Exclusions:'&...] n8{for exclusion in self.scope.exclus...} n9[lines.append(f' - {exclusion}...] n10[] n11{if len(self.scope.exclusions) > 5} n12[lines.append(f' ... and {len(...] n13[] n14[] n15[stats = self.get_stats()] n16{if stats['total_checked']...} n17[lines.append('\n Statistics:&#39...] n18[lines.append(f" Total Checked: {stat...] n19[lines.append(f" In Scope: {stats[...] n20[lines.append(f" Out of Scope: {stats...] n21{if stats['total_checked']...} n22[in_scope_percent = stats['in_scope&&#...] n23[lines.append(f' In Scope %: {in_s...] n24[] n25[] n26[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n14 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n8 n10 --> n11 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 -->|Yes| n17 n16 -->|No| n25 n17 --> n18 n18 --> n19 n19 --> n20 n20 --> n21 n21 -->|Yes| n22 n21 -->|No| n24 n22 --> n23 n23 --> n24 n24 --> n25 n25 --> n26 n26 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取範圍配置摘要\n\n        Returns:\n    ...]
    n4[allowed_hosts_display = ', '.join...]
    n5[lines = ['Scope Configuratio...]
    n6{if self.scope.exclusions}
    n7[lines.append('  Exclusions:'&...]
    n8{for exclusion in self.scope.exclus...}
    n9[lines.append(f'    - {exclusion&#125...]
    n10[]
    n11{if len(self.scope.exclusions) > 5}
    n12[lines.append(f'    ... and {len(...]
    n13[]
    n14[]
    n15[stats = self.get_stats()]
    n16{if stats['total_checked']...}
    n17[lines.append('\n  Statistics:&#39...]
    n18[lines.append(f"    Total Checked: {stat...]
    n19[lines.append(f"    In Scope: {stats&#91...]
    n20[lines.append(f"    Out of Scope: {stats...]
    n21{if stats['total_checked']...}
    n22[in_scope_percent = stats['in_scope&&#...]
    n23[lines.append(f'    In Scope %: {in_s...]
    n24[]
    n25[]
    n26[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n14
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n8
    n10 --> n11
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 -->|Yes| n17
    n16 -->|No| n25
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 -->|Yes| n22
    n21 -->|No| n24
    n22 --> n23
    n23 --> n24
    n24 --> n25
    n25 --> n26
    n26 --> n2
230. scan aiva scan scope manager Function get stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取統計信息\n\n Returns:\n ...] n4[return self._stats.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取統計信息\n\n        Returns:\n      ...]
    n4[return self._stats.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
231. scan aiva scan scope manager Function is host allowed
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查主機名是否被允許\n\n Args:\n ...] n4[return self._is_host_allowed(hostname...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查主機名是否被允許\n\n        Args:\n     ...]
    n4[return self._is_host_allowed(hostname...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
232. scan aiva scan scope manager Function is in scope
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 檢查 URL 是否在掃描範圍內\n\n Args:\n...] n4[self._stats['total_checked'&#...] n5[try] n6[parsed = urlparse(url)] n7{if not self._is_host_allowed(p...} n8[logger.debug(f'Host not allowed: {pa...] n9[self._stats['out_of_scope' ...] n10[return False] n11[] n12{if self._matches_exclusion(url)} n13[logger.debug(f'Matches exclusion pattern:...] n14[self._stats['out_of_scope' ...] n15[return False] n16[] n17[self._stats['in_scope'] += 1] n18[return True] n19[] n20[except Exception] n21[logger.warning(f'Failed to parse URL ...] n22[self._stats['out_of_scope' ...] n23[return False] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n5 --> n20 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n11 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n16 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n2 n20 --> n21 n21 --> n22 n22 --> n23 n23 --> n19
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        檢查 URL 是否在掃描範圍內\n\n        Args:\n...]
    n4[self._stats['total_checked'&#...]
    n5[try]
    n6[parsed = urlparse(url)]
    n7{if not self._is_host_allowed(p...}
    n8[logger.debug(f'Host not allowed: {pa...]
    n9[self._stats['out_of_scope'&#9...]
    n10[return False]
    n11[]
    n12{if self._matches_exclusion(url)}
    n13[logger.debug(f'Matches exclusion pattern:...]
    n14[self._stats['out_of_scope'&#9...]
    n15[return False]
    n16[]
    n17[self._stats['in_scope'] += 1]
    n18[return True]
    n19[]
    n20[except Exception]
    n21[logger.warning(f'Failed to parse URL &#12...]
    n22[self._stats['out_of_scope'&#9...]
    n23[return False]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n5 --> n20
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n11
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n16
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n2
    n20 --> n21
    n21 --> n22
    n22 --> n23
    n23 --> n19
233. scan aiva scan scope manager Function is subdomain included
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['是否包含子域名'] n4[return self.scope.include_subdomains] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['是否包含子域名']
    n4[return self.scope.include_subdomains]
    n1 --> n3
    n3 --> n4
    n4 --> n2
234. scan aiva scan scope manager Function merge with
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 合併另一個範圍管理器的配置\n\n Args:\n ...] n4{for host in other.get_allowed...} n5[self.add_allowed_host(host)] n6[] n7{for exclusion in other.get_exclusi...} n8{if exclusion not in self.scope...} n9[self.add_exclusion(exclusion)] n10[] n11[] n12{if other.is_subdomain_included...} n13[self.set_include_subdomains(True)] n14[] n15[logger.info('Merged scope configurations&...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n4 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n11 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n10 n10 --> n7 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n14 n13 --> n14 n14 --> n15 n15 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        合併另一個範圍管理器的配置\n\n        Args:\n  ...]
    n4{for host in other.get_allowed...}
    n5[self.add_allowed_host(host)]
    n6[]
    n7{for exclusion in other.get_exclusi...}
    n8{if exclusion not in self.scope...}
    n9[self.add_exclusion(exclusion)]
    n10[]
    n11[]
    n12{if other.is_subdomain_included...}
    n13[self.set_include_subdomains(True)]
    n14[]
    n15[logger.info('Merged scope configurations&...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n4
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n11
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n10
    n10 --> n7
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n14
    n13 --> n14
    n14 --> n15
    n15 --> n2
235. scan aiva scan scope manager Function remove allowed host
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 移除允許的主機\n\n Args:\n ...] n4{if hostname in self._allowed_h...} n5[self._allowed_hosts_set.remove(hostname)] n6{if hostname in self.scope.allo...} n7[self.scope.allowed_hosts.remove(hostname)] n8[] n9[logger.info(f'Removed allowed host: {...] n10[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n10 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n8 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        移除允許的主機\n\n        Args:\n        ...]
    n4{if hostname in self._allowed_h...}
    n5[self._allowed_hosts_set.remove(hostname)]
    n6{if hostname in self.scope.allo...}
    n7[self.scope.allowed_hosts.remove(hostname)]
    n8[]
    n9[logger.info(f'Removed allowed host: &#123...]
    n10[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n10
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n8
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
236. scan aiva scan scope manager Function remove exclusion
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 移除排除模式\n\n Args:\n ...] n4{if pattern in self.scope.exclu...} n5[self.scope.exclusions.remove(pattern)] n6[self._exclusion_patterns = self._compile_exclus...] n7[logger.info(f'Removed exclusion pattern: ...] n8[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n8 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        移除排除模式\n\n        Args:\n         ...]
    n4{if pattern in self.scope.exclu...}
    n5[self.scope.exclusions.remove(pattern)]
    n6[self._exclusion_patterns = self._compile_exclus...]
    n7[logger.info(f'Removed exclusion pattern: ...]
    n8[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n8
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
237. scan aiva scan scope manager Function reset stats
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置統計信息'] n4[self._stats = {'total_checked&#3...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置統計信息']
    n4[self._stats = {'total_checked&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
238. scan aiva scan scope manager Function set include subdomains
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置是否包含子域名\n\n Args:\n ...] n4[self.scope.include_subdomains = include] n5[logger.info(f'Set include_subdomains to: ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置是否包含子域名\n\n        Args:\n      ...]
    n4[self.scope.include_subdomains = include]
    n5[logger.info(f'Set include_subdomains to: ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
239. scan aiva scan scope manager Function validate scope
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 驗證範圍配置的有效性\n\n Returns:\n ...] n4[errors = []] n5{for pattern in self.scope.exclus...} n6[try] n7[self._compile_pattern(pattern)] n8[] n9[except re.error] n10[errors.append(f"Invalid exclusion pattern &a...] n11[] n12{for host in self._allowed_hos...} n13{if not self._is_valid_hostname...} n14[errors.append(f"Invalid hostname: &#...] n15[] n16[] n17[is_valid = len(errors) == 0] n18[return (is_valid, errors)] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n11 n6 --> n7 n6 --> n9 n7 --> n8 n8 --> n5 n9 --> n10 n10 --> n8 n11 --> n12 n12 -->|Yes| n13 n12 -->|No| n16 n13 -->|Yes| n14 n13 -->|No| n15 n14 --> n15 n15 --> n12 n16 --> n17 n17 --> n18 n18 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        驗證範圍配置的有效性\n\n        Returns:\n  ...]
    n4[errors = []]
    n5{for pattern in self.scope.exclus...}
    n6[try]
    n7[self._compile_pattern(pattern)]
    n8[]
    n9[except re.error]
    n10[errors.append(f"Invalid exclusion pattern &a...]
    n11[]
    n12{for host in self._allowed_hos...}
    n13{if not self._is_valid_hostname...}
    n14[errors.append(f"Invalid hostname: &#...]
    n15[]
    n16[]
    n17[is_valid = len(errors) == 0]
    n18[return (is_valid, errors)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n11
    n6 --> n7
    n6 --> n9
    n7 --> n8
    n8 --> n5
    n9 --> n10
    n10 --> n8
    n11 --> n12
    n12 -->|Yes| n13
    n12 -->|No| n16
    n13 -->|Yes| n14
    n13 -->|No| n15
    n14 --> n15
    n15 --> n12
    n16 --> n17
    n17 --> n18
    n18 --> n2
240. scan aiva scan scope manager Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import re] n5[from urllib.parse import urlparse] n6[from services.aiva_common.schemas import ScanScope] n7[from services.aiva_common.utils import get_logger] n8[logger = get_logger(__name__)] n9[class ScopeManager(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import re]
    n5[from urllib.parse import urlparse]
    n6[from services.aiva_common.schemas import ScanScope]
    n7[from services.aiva_common.utils import get_logger]
    n8[logger = get_logger(__name__)]
    n9[class ScopeManager(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
241. scan aiva scan sensitive data scanner Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化敏感資料掃描器'] n4[self.compiled_patterns = {name: re.compile(pa...] n5[self.matches: list[SensitiveMatch] = []] n6[logger.debug('SensitiveDataScanner initia...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化敏感資料掃描器']
    n4[self.compiled_patterns = {name: re.compile(pa...]
    n5[self.matches: list[SensitiveMatch] = []]
    n6[logger.debug('SensitiveDataScanner initia...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
242. scan aiva scan sensitive data scanner Function determine severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...] n4[critical_patterns = ['aws_secret_key&...] n5[high_patterns = ['aws_access_key&#...] n6[medium_patterns = ['api_key_generic&&...] n7{if pattern_type in critical_pa...} n8[return Severity.CRITICAL] n9{if pattern_type in high_patterns} n10[return Severity.HIGH] n11{if pattern_type in medium_patt...} n12[return Severity.MEDIUM] n13[return Severity.LOW] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n15 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據模式類型判斷嚴重程度\n\n        Args:\n   ...]
    n4[critical_patterns = ['aws_secret_key&...]
    n5[high_patterns = ['aws_access_key&&#35...]
    n6[medium_patterns = ['api_key_generic&&...]
    n7{if pattern_type in critical_pa...}
    n8[return Severity.CRITICAL]
    n9{if pattern_type in high_patterns}
    n10[return Severity.HIGH]
    n11{if pattern_type in medium_patt...}
    n12[return Severity.MEDIUM]
    n13[return Severity.LOW]
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n15
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
243. scan aiva scan sensitive data scanner Function get context
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取匹配的上下文\n\n Args:\n ...] n4[context_start = max(0, start - conte...] n5[context_end = min(len(content), en...] n6[context = content[context_star...] n7[match_length = end - start] n8[match_in_context_start = start - context_star...] n9[match_in_context_end = match_in_context_sta...] n10[masked_context = context[:match_in_co...] n11[return masked_context.replace('\n&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取匹配的上下文\n\n        Args:\n       ...]
    n4[context_start = max(0, start - conte...]
    n5[context_end = min(len(content), en...]
    n6[context = content[context_star...]
    n7[match_length = end - start]
    n8[match_in_context_start = start - context_star...]
    n9[match_in_context_end = match_in_context_sta...]
    n10[masked_context = context[:match_in_co...]
    n11[return masked_context.replace('\n&&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
244. scan aiva scan sensitive data scanner Function get severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...] n4[critical_patterns = ['aws_secret_key&...] n5[high_patterns = ['aws_access_key&#...] n6[medium_patterns = ['api_key_generic&&...] n7{if pattern_type in critical_pa...} n8[return 'critical'] n9{if pattern_type in high_patterns} n10[return 'high'] n11{if pattern_type in medium_patt...} n12[return 'medium'] n13[return 'low'] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n15 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據模式類型判斷嚴重程度\n\n        Args:\n   ...]
    n4[critical_patterns = ['aws_secret_key&...]
    n5[high_patterns = ['aws_access_key&&#35...]
    n6[medium_patterns = ['api_key_generic&&...]
    n7{if pattern_type in critical_pa...}
    n8[return 'critical']
    n9{if pattern_type in high_patterns}
    n10[return 'high']
    n11{if pattern_type in medium_patt...}
    n12[return 'medium']
    n13[return 'low']
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n15
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
245. scan aiva scan sensitive data scanner Function mask sensitive value
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...] n4{if len(value) <= 8} n5[return '***'] n6[] n7[return f'{value[:4]}... ...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        遮罩敏感值以避免在日誌中暴露\n\n        Args:\n ...]
    n4{if len(value) <= 8}
    n5[return '***']
    n6[]
    n7[return f'{value[:4]}...&#12...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n2
246. scan aiva scan sensitive data scanner Function clear matches
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空所有匹配記錄'] n4[self.matches.clear()] n5[logger.debug('Cleared all sensitive data ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空所有匹配記錄']
    n4[self.matches.clear()]
    n5[logger.debug('Cleared all sensitive data ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
247. scan aiva scan sensitive data scanner Function get all matches
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取所有發現的敏感資料匹配\n\n Returns:\...] n4[return self.matches.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取所有發現的敏感資料匹配\n\n        Returns:\...]
    n4[return self.matches.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
248. scan aiva scan sensitive data scanner Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取統計信息\n\n Returns:\n ...] n4[stats: dict[str, Any] = {'total_...] n5{for match in self.matches} n6[stats['by_type'][matc...] n7[stats['by_severity'][...] n8[] n9[return stats] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取統計信息\n\n        Returns:\n      ...]
    n4[stats: dict[str, Any] = {'total_...]
    n5{for match in self.matches}
    n6[stats['by_type'][matc...]
    n7[stats['by_severity'][...]
    n8[]
    n9[return stats]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
249. scan aiva scan sensitive data scanner Function scan content
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 掃描內容中的敏感資料\n\n Args:\n ...] n4[matches: list[SensitiveMatch] = []] n5{for (pattern_name, pattern_regex) in self.compile...} n6[found_matches = pattern_regex.findit...] n7{for match in found_matches} n8[sensitive_match = SensitiveMatch(match...] n9[matches.append(sensitive_match)] n10[self.matches.append(sensitive_match)] n11[logger.warning(f'Sensitive data found: &#...] n12[] n13[] n14{if matches} n15[logger.info(f'Found {len(matches...] n16[] n17[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n13 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n7 n12 --> n5 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n16 n15 --> n16 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        掃描內容中的敏感資料\n\n        Args:\n     ...]
    n4[matches: list[SensitiveMatch] = []]
    n5{for (pattern_name, pattern_regex) in self.compile...}
    n6[found_matches = pattern_regex.findit...]
    n7{for match in found_matches}
    n8[sensitive_match = SensitiveMatch(match...]
    n9[matches.append(sensitive_match)]
    n10[self.matches.append(sensitive_match)]
    n11[logger.warning(f'Sensitive data found: &#...]
    n12[]
    n13[]
    n14{if matches}
    n15[logger.info(f'Found {len(matches...]
    n16[]
    n17[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n13
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n7
    n12 --> n5
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n16
    n15 --> n16
    n16 --> n17
    n17 --> n2
250. scan aiva scan sensitive data scanner Function scan headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...] n4[matches: list[SensitiveMatch] = []] n5[sensitive_headers = ['authorization&&...] n6{for (header_name, header_value) in headers.items&...} n7{if header_name.lower() in sens...} n8[sensitive_match = SensitiveMatch(match...] n9[matches.append(sensitive_match)] n10[self.matches.append(sensitive_match)] n11[logger.warning(f'Sensitive header found: ...] n12[] n13[] n14[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n13 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n6 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        掃描 HTTP 標頭中的敏感資料\n\n        Args:\...]
    n4[matches: list[SensitiveMatch] = []]
    n5[sensitive_headers = ['authorization&&...]
    n6{for (header_name, header_value) in headers.items&...}
    n7{if header_name.lower() in sens...}
    n8[sensitive_match = SensitiveMatch(match...]
    n9[matches.append(sensitive_match)]
    n10[self.matches.append(sensitive_match)]
    n11[logger.warning(f'Sensitive header found: ...]
    n12[]
    n13[]
    n14[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n13
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n6
    n13 --> n14
    n14 --> n2
251. scan aiva scan sensitive data scanner Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...] n4[from __future__ import annotations] n5[import re] n6[from typing import Any] n7[from services.aiva_common.enums import Severity] n8[from services.aiva_common.schemas import Sensitive...] n9[from services.aiva_common.utils import get_logger,...] n10[logger = get_logger(__name__)] n11[class SensitiveDataScanner(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
    n4[from __future__ import annotations]
    n5[import re]
    n6[from typing import Any]
    n7[from services.aiva_common.enums import Severity]
    n8[from services.aiva_common.schemas import Sensitive...]
    n9[from services.aiva_common.utils import get_logger,...]
    n10[logger = get_logger(__name__)]
    n11[class SensitiveDataScanner(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
252. scan aiva scan strategy controller Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化策略控制器\n\n Args:\n ...] n4[self.strategy = strategy.lower()] n5[self._parameters = self._load_strategy_...] n6[self._customizations: dict[str, Any] = {}] n7[logger.info(f'StrategyController initiali...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化策略控制器\n\n        Args:\n       ...]
    n4[self.strategy = strategy.lower()]
    n5[self._parameters = self._load_strategy_...]
    n6[self._customizations: dict[str, Any] = {}]
    n7[logger.info(f'StrategyController initiali...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
253. scan aiva scan strategy controller Function load strategy parameters
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 加載策略參數\n\n Returns:\n ...] n4{if self.strategy in self._STRA...} n5[return self._STRATEGY_PRESETS[self.st...] n6[] n7[logger.warning(f"Unknown strategy &#...] n8[return self._STRATEGY_PRESETS[ScanStr...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        加載策略參數\n\n        Returns:\n      ...]
    n4{if self.strategy in self._STRA...}
    n5[return self._STRATEGY_PRESETS[self.st...]
    n6[]
    n7[logger.warning(f"Unknown strategy &#...]
    n8[return self._STRATEGY_PRESETS[ScanStr...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
254. scan aiva scan strategy controller Function apply to config
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 將策略應用到配置控制中心\n\n Args:\n ...] n4[params = self._parameters] n5[config_center.update_crawling_config(max_depth=par...] n6[config_center.update_dynamic_config(enabled=params...] n7[config_center.update_performance_config(max_concur...] n8[logger.info(f"Applied strategy '...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        將策略應用到配置控制中心\n\n        Args:\n   ...]
    n4[params = self._parameters]
    n5[config_center.update_crawling_config(max_depth=par...]
    n6[config_center.update_dynamic_config(enabled=params...]
    n7[config_center.update_performance_config(max_concur...]
    n8[logger.info(f"Applied strategy '...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
255. scan aiva scan strategy controller Function clone
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 克隆當前策略控制器\n\n Returns:\n ...] n4[new_controller = StrategyController(s...] n5[new_controller._parameters = StrategyParameters(*...] n6[new_controller._customizations = self._customizations...] n7[return new_controller] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        克隆當前策略控制器\n\n        Returns:\n   ...]
    n4[new_controller = StrategyController(s...]
    n5[new_controller._parameters = StrategyParameters(*...]
    n6[new_controller._customizations = self._customizations...]
    n7[return new_controller]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n2
256. scan aiva scan strategy controller Function compare with
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 比較與另一個策略的差異\n\n Args:\n ...] n4{if other_strategy not in self....} n5[logger.warning(f'Unknown strategy for com...] n6[return {}] n7[] n8[other_params = self._STRATEGY_PRESE...] n9[current_params = self._parameters] n10[differences = {}] n11{for field in current_params.__...} n12[current_value = getattr(current_para...] n13[other_value = getattr(other_params...] n14{if current_value != other_value} n15[differences[field] = (current_value, othe...] n16[] n17[] n18[return differences] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n7 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 -->|Yes| n12 n11 -->|No| n17 n12 --> n13 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n16 n15 --> n16 n16 --> n11 n17 --> n18 n18 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        比較與另一個策略的差異\n\n        Args:\n    ...]
    n4{if other_strategy not in self....}
    n5[logger.warning(f'Unknown strategy for com...]
    n6[return {}]
    n7[]
    n8[other_params = self._STRATEGY_PRESE...]
    n9[current_params = self._parameters]
    n10[differences = {}]
    n11{for field in current_params.__...}
    n12[current_value = getattr(current_para...]
    n13[other_value = getattr(other_params...]
    n14{if current_value != other_value}
    n15[differences[field] = (current_value, othe...]
    n16[]
    n17[]
    n18[return differences]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n7
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 -->|Yes| n12
    n11 -->|No| n17
    n12 --> n13
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n16
    n15 --> n16
    n16 --> n11
    n17 --> n18
    n18 --> n2
257. scan aiva scan strategy controller Function customize
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 自定義策略參數\n\n Args:\n ...] n4{for (key, value) in kwargs.items()} n5{if hasattr(self._parameters, key)} n6[setattr(self._parameters, key, value)] n7[self._customizations[key] = value] n8[logger.debug(f'Customized parameter: ...] n9[logger.warning(f'Unknown parameter: {...] n10[] n11[] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n11 n5 -->|Yes| n6 n5 -->|No| n9 n6 --> n7 n7 --> n8 n8 --> n10 n9 --> n10 n10 --> n4 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        自定義策略參數\n\n        Args:\n        ...]
    n4{for (key, value) in kwargs.items()}
    n5{if hasattr(self._parameters, key)}
    n6[setattr(self._parameters, key, value)]
    n7[self._customizations[key] = value]
    n8[logger.debug(f'Customized parameter: &#12...]
    n9[logger.warning(f'Unknown parameter: &#123...]
    n10[]
    n11[]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n11
    n5 -->|Yes| n6
    n5 -->|No| n9
    n6 --> n7
    n7 --> n8
    n8 --> n10
    n9 --> n10
    n10 --> n4
    n11 --> n2
258. scan aiva scan strategy controller Function estimate scan time
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 估算掃描時間(秒)\n\n Args:\n ...] n4[params = self._parameters] n5[pages = min(estimated_pages,...] n6[time_by_rate = pages / params.reque...] n7[time_by_timeout = pages * params.reque...] n8[estimated_time = max(time_by_rate, ti...] n9{if params.enable_dynamic_scan} n10[estimated_time *= 1.5] n11[] n12[return estimated_time] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        估算掃描時間(秒)\n\n        Args:\n      ...]
    n4[params = self._parameters]
    n5[pages = min(estimated_pages,...]
    n6[time_by_rate = pages / params.reque...]
    n7[time_by_timeout = pages * params.reque...]
    n8[estimated_time = max(time_by_rate, ti...]
    n9{if params.enable_dynamic_scan}
    n10[estimated_time *= 1.5]
    n11[]
    n12[return estimated_time]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n2
259. scan aiva scan strategy controller Function get available strategies
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取所有可用的策略名稱'] n4[return list(cls._STRATEGY_PRESETS.key...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取所有可用的策略名稱']
    n4[return list(cls._STRATEGY_PRESETS.key...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
260. scan aiva scan strategy controller Function get concurrent requests
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取並發請求數'] n4[return self._parameters.concurrent_re...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取並發請求數']
    n4[return self._parameters.concurrent_re...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
261. scan aiva scan strategy controller Function get max depth
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取最大爬蟲深度'] n4[return self._parameters.max_depth] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取最大爬蟲深度']
    n4[return self._parameters.max_depth]
    n1 --> n3
    n3 --> n4
    n4 --> n2
262. scan aiva scan strategy controller Function get max pages
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取最大頁面數'] n4[return self._parameters.max_pages] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取最大頁面數']
    n4[return self._parameters.max_pages]
    n1 --> n3
    n3 --> n4
    n4 --> n2
263. scan aiva scan strategy controller Function get parameters
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取當前策略參數\n\n Returns:\n ...] n4[return self._parameters] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取當前策略參數\n\n        Returns:\n    ...]
    n4[return self._parameters]
    n1 --> n3
    n3 --> n4
    n4 --> n2
264. scan aiva scan strategy controller Function get recommended strategy for target
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據目標特徵推薦策略\n\n Args:\n ...] n4[recommendations = {('small&#...] n5[key = (target_size.lower()...] n6[recommended = recommendations.get(...] n7[logger.info(f'Recommended strategy for &#...] n8[return recommended] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據目標特徵推薦策略\n\n        Args:\n     ...]
    n4[recommendations = {('small&#...]
    n5[key = (target_size.lower()...]
    n6[recommended = recommendations.get(...]
    n7[logger.info(f'Recommended strategy for &#...]
    n8[return recommended]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
265. scan aiva scan strategy controller Function get requests per second
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取每秒請求數'] n4[return self._parameters.requests_per_...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取每秒請求數']
    n4[return self._parameters.requests_per_...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
266. scan aiva scan strategy controller Function get strategy description
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取策略描述\n\n Args:\n ...] n4[descriptions = {ScanStrategy.CONSER...] n5[return descriptions.get(strategy, '未知...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取策略描述\n\n        Args:\n         ...]
    n4[descriptions = {ScanStrategy.CONSER...]
    n5[return descriptions.get(strategy, '未知...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
267. scan aiva scan strategy controller Function get strategy name
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['獲取策略名稱'] n4[return self.strategy] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['獲取策略名稱']
    n4[return self.strategy]
    n1 --> n3
    n3 --> n4
    n4 --> n2
268. scan aiva scan strategy controller Function get strategy summary
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取策略摘要\n\n Returns:\n ...] n4[params = self._parameters] n5[lines = [f'Strategy: {self.s...] n6{if self._customizations} n7[lines.append('\n Customizations:&...] n8{for (key, value) in self._customizati...} n9[lines.append(f' {key}: {...] n10[] n11[] n12[return '\n'.join(lines)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n11 n7 --> n8 n8 -->|Yes| n9 n8 -->|No| n10 n9 --> n8 n10 --> n11 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取策略摘要\n\n        Returns:\n      ...]
    n4[params = self._parameters]
    n5[lines = [f'Strategy: {self.s...]
    n6{if self._customizations}
    n7[lines.append('\n  Customizations:&&#3...]
    n8{for (key, value) in self._customizati...}
    n9[lines.append(f'    {key}: &#123...]
    n10[]
    n11[]
    n12[return '\n'.join(lines)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n11
    n7 --> n8
    n8 -->|Yes| n9
    n8 -->|No| n10
    n9 --> n8
    n10 --> n11
    n11 --> n12
    n12 --> n2
269. scan aiva scan strategy controller Function is aggressive
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['是否為激進策略'] n4[return self.strategy in [ScanStrategy...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['是否為激進策略']
    n4[return self.strategy in [ScanStrategy...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
270. scan aiva scan strategy controller Function is dynamic scan enabled
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['是否啟用動態掃描'] n4[return self._parameters.enable_dynami...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['是否啟用動態掃描']
    n4[return self._parameters.enable_dynami...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
271. scan aiva scan strategy controller Function is stealth
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['是否為隱秘策略'] n4[return self.strategy == ScanStrategy....] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['是否為隱秘策略']
    n4[return self.strategy == ScanStrategy....]
    n1 --> n3
    n3 --> n4
    n4 --> n2
272. scan aiva scan strategy controller Function reset customizations
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置所有自定義參數'] n4[self._parameters = self._load_strategy_...] n5[self._customizations.clear()] n6[logger.info(f"Reset customizations for strat...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置所有自定義參數']
    n4[self._parameters = self._load_strategy_...]
    n5[self._customizations.clear()]
    n6[logger.info(f"Reset customizations for strat...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
273. scan aiva scan strategy controller Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[from dataclasses import dataclass] n5[from enum import Enum] n6[from typing import Any] n7[from services.aiva_common.utils import get_logger] n8[logger = get_logger(__name__)] n9[class ScanStrategy(...)] n10[class StrategyParameters(...)] n11[class StrategyController(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[from dataclasses import dataclass]
    n5[from enum import Enum]
    n6[from typing import Any]
    n7[from services.aiva_common.utils import get_logger]
    n8[logger = get_logger(__name__)]
    n9[class ScanStrategy(...)]
    n10[class StrategyParameters(...)]
    n11[class StrategyController(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
274. scan aiva scan worker Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[from __future__ import annotations] n4[import json] n5[import time] n6[from services.aiva_common.enums import ModuleName,...] n7[from services.aiva_common.mq import get_broker] n8[from services.aiva_common.schemas import AivaMessa...] n9[from services.aiva_common.utils import get_logger,...] n10[from .authentication_manager import Authentication...] n11[from .core_crawling_engine.http_client_hi import H...] n12[from .core_crawling_engine.static_content_parser i...] n13[from .core_crawling_engine.url_queue_manager impor...] n14[from .fingerprint_manager import FingerprintCollec...] n15[from .header_configuration import HeaderConfigurat...] n16[logger = get_logger(__name__)] n17[def run(...)] n18[def _perform_scan(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[from __future__ import annotations]
    n4[import json]
    n5[import time]
    n6[from services.aiva_common.enums import ModuleName,...]
    n7[from services.aiva_common.mq import get_broker]
    n8[from services.aiva_common.schemas import AivaMessa...]
    n9[from services.aiva_common.utils import get_logger,...]
    n10[from .authentication_manager import Authentication...]
    n11[from .core_crawling_engine.http_client_hi import H...]
    n12[from .core_crawling_engine.static_content_parser i...]
    n13[from .core_crawling_engine.url_queue_manager impor...]
    n14[from .fingerprint_manager import FingerprintCollec...]
    n15[from .header_configuration import HeaderConfigurat...]
    n16[logger = get_logger(__name__)]
    n17[def run(...)]
    n18[def _perform_scan(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n2
275. scan aiva scan worker refactored Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n重構的 Scan Worker\n使用 ScanOrchestrator 進行統一的...] n4[from __future__ import annotations] n5[import json] n6[from services.aiva_common.enums import ModuleName,...] n7[from services.aiva_common.mq import get_broker] n8[from services.aiva_common.schemas import AivaMessa...] n9[from services.aiva_common.utils import get_logger,...] n10[from .scan_orchestrator import ScanOrchestrator] n11[logger = get_logger(__name__)] n12[def run(...)] n13[def _perform_scan_with_orchestrator(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n重構的 Scan Worker\n使用 ScanOrchestrator 進行統一的...]
    n4[from __future__ import annotations]
    n5[import json]
    n6[from services.aiva_common.enums import ModuleName,...]
    n7[from services.aiva_common.mq import get_broker]
    n8[from services.aiva_common.schemas import AivaMessa...]
    n9[from services.aiva_common.utils import get_logger,...]
    n10[from .scan_orchestrator import ScanOrchestrator]
    n11[logger = get_logger(__name__)]
    n12[def run(...)]
    n13[def _perform_scan_with_orchestrator(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
276. scan discovery schemas Function validate finding id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('finding_&#39...} n4[raise ValueError("finding_id must start with...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('finding_&#39...}
    n4[raise ValueError("finding_id must start with...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
277. scan discovery schemas Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('scan_')} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('scan_')}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
278. scan discovery schemas Function validate strategy
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3[allowed_strategies = ['passive&#3...] n4{if v not in allowed_strategies} n5[raise ValueError(f'Strategy must be one o...] n6[] n7[return v] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3[allowed_strategies = ['passive&#3...]
    n4{if v not in allowed_strategies}
    n5[raise ValueError(f'Strategy must be one o...]
    n6[]
    n7[return v]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n2
279. scan discovery schemas Function validate targets
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if len(v) > 100} n4[raise ValueError('Cannot scan more than 1...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if len(v) > 100}
    n4[raise ValueError('Cannot scan more than 1...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
280. scan discovery schemas Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nAIVA 掃描發現模式定義\n\n包含掃描、發現、資產清點、技術指紋等相關的數據模式...] n4[from __future__ import annotations] n5[from datetime import UTC, datetime] n6[from typing import Any] n7[from services.aiva_common.enums import AssetType, ...] n8[from services.aiva_common.standards import CVERefe...] n9[from pydantic import BaseModel, Field, HttpUrl, fi...] n10[class ScanScope(...)] n11[class ScanRequest(...)] n12[class Asset(...)] n13[class TechStackInfo(...)] n14[class ServiceInfo(...)] n15[class Fingerprints(...)] n16[class AssetInventory(...)] n17[class ScanResult(...)] n18[class TargetInfo(...)] n19[class FindingEvidence(...)] n20[class FindingImpact(...)] n21[class FindingRecommendation(...)] n22[class VulnerabilityFinding(...)] n23[class ScopeDefinition(...)] n24[__all__ = ['ScanScope', &...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 --> n21 n21 --> n22 n22 --> n23 n23 --> n24 n24 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nAIVA 掃描發現模式定義\n\n包含掃描、發現、資產清點、技術指紋等相關的數據模式...]
    n4[from __future__ import annotations]
    n5[from datetime import UTC, datetime]
    n6[from typing import Any]
    n7[from services.aiva_common.enums import AssetType, ...]
    n8[from services.aiva_common.standards import CVERefe...]
    n9[from pydantic import BaseModel, Field, HttpUrl, fi...]
    n10[class ScanScope(...)]
    n11[class ScanRequest(...)]
    n12[class Asset(...)]
    n13[class TechStackInfo(...)]
    n14[class ServiceInfo(...)]
    n15[class Fingerprints(...)]
    n16[class AssetInventory(...)]
    n17[class ScanResult(...)]
    n18[class TargetInfo(...)]
    n19[class FindingEvidence(...)]
    n20[class FindingImpact(...)]
    n21[class FindingRecommendation(...)]
    n22[class VulnerabilityFinding(...)]
    n23[class ScopeDefinition(...)]
    n24[__all__ = ['ScanScope', &...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 --> n2
281. scan models Function validate scan id
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3{if not v.startswith('scan_')} n4[raise ValueError("scan_id must start with &a...] n5[] n6[return v] n1 --> n3 n3 -->|Yes| n4 n3 -->|No| n5 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3{if not v.startswith('scan_')}
    n4[raise ValueError("scan_id must start with &a...]
    n5[]
    n6[return v]
    n1 --> n3
    n3 -->|Yes| n4
    n3 -->|No| n5
    n4 --> n5
    n5 --> n6
    n6 --> n2
282. scan models Function validate strategy
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['驗證掃描策略'] n4[allowed = {'quick', &...] n5{if v not in allowed} n6[raise ValueError(f'strategy must be one o...] n7[] n8[return v] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['驗證掃描策略']
    n4[allowed = {'quick', &&#3...]
    n5{if v not in allowed}
    n6[raise ValueError(f'strategy must be one o...]
    n7[]
    n8[return v]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n2
283. scan models Function validate targets
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['驗證目標列表'] n4{if not v} n5[raise ValueError('At least one target req...] n6[] n7{if len(v) > 100} n8[raise ValueError('Too many targets (m...] n9[] n10[return v] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['驗證目標列表']
    n4{if not v}
    n5[raise ValueError('At least one target req...]
    n6[]
    n7{if len(v) > 100}
    n8[raise ValueError('Too many targets (m...]
    n9[]
    n10[return v]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n9
    n9 --> n10
    n10 --> n2
284. scan models Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\nAIVA Scan Models - 掃描發現模組\n\n此文件包含與掃描、資產發現...] n4[from __future__ import annotations] n5[from datetime import UTC, datetime] n6[from typing import Any] n7[from pydantic import BaseModel, Field, HttpUrl, fi...] n8[from ..aiva_common.enums import AssetType, Confide...] n9[from ..aiva_common.schemas import Authentication, ...] n10[class ScanScope(...)] n11[class ScanStartPayload(...)] n12[class EnhancedScanScope(...)] n13[class EnhancedScanRequest(...)] n14[class Asset(...)] n15[class TechnicalFingerprint(...)] n16[class Fingerprints(...)] n17[class AssetInventoryItem(...)] n18[class Summary(...)] n19[class ScanCompletedPayload(...)] n20[class Vulnerability(...)] n21[class VulnerabilityDiscovery(...)] n22[class VulnerabilityLifecyclePayload(...)] n23[class VulnerabilityUpdatePayload(...)] n24[class DiscoveredAsset(...)] n25[class EASMDiscoveryPayload(...)] n26[class EASMDiscoveryResult(...)] n27[class EASMAsset(...)] n28[class AssetLifecyclePayload(...)] n29[class JavaScriptAnalysisResult(...)] n30[__all__ = ['ScanScope', &...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 --> n21 n21 --> n22 n22 --> n23 n23 --> n24 n24 --> n25 n25 --> n26 n26 --> n27 n27 --> n28 n28 --> n29 n29 --> n30 n30 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\nAIVA Scan Models - 掃描發現模組\n\n此文件包含與掃描、資產發現...]
    n4[from __future__ import annotations]
    n5[from datetime import UTC, datetime]
    n6[from typing import Any]
    n7[from pydantic import BaseModel, Field, HttpUrl, fi...]
    n8[from ..aiva_common.enums import AssetType, Confide...]
    n9[from ..aiva_common.schemas import Authentication, ...]
    n10[class ScanScope(...)]
    n11[class ScanStartPayload(...)]
    n12[class EnhancedScanScope(...)]
    n13[class EnhancedScanRequest(...)]
    n14[class Asset(...)]
    n15[class TechnicalFingerprint(...)]
    n16[class Fingerprints(...)]
    n17[class AssetInventoryItem(...)]
    n18[class Summary(...)]
    n19[class ScanCompletedPayload(...)]
    n20[class Vulnerability(...)]
    n21[class VulnerabilityDiscovery(...)]
    n22[class VulnerabilityLifecyclePayload(...)]
    n23[class VulnerabilityUpdatePayload(...)]
    n24[class DiscoveredAsset(...)]
    n25[class EASMDiscoveryPayload(...)]
    n26[class EASMDiscoveryResult(...)]
    n27[class EASMAsset(...)]
    n28[class AssetLifecyclePayload(...)]
    n29[class JavaScriptAnalysisResult(...)]
    n30[__all__ = ['ScanScope', &...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 --> n21
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 --> n25
    n25 --> n26
    n26 --> n27
    n27 --> n28
    n28 --> n29
    n29 --> n30
    n30 --> n2
285. scan context Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 初始化掃描上下文\n\n Args:\n ...] n4[self.request = request] n5[self._start_time = time.time()] n6[self.assets: list[Asset] = []] n7[self.urls_found = 0] n8[self.forms_found = 0] n9[self.apis_found = 0] n10[self.pages_crawled = 0] n11[self.fingerprints: Fingerprints | None = None] n12[self.errors: list[dict[str, str]] = [...] n13[logger.debug(f'Scan context initialized f...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        初始化掃描上下文\n\n        Args:\n       ...]
    n4[self.request = request]
    n5[self._start_time = time.time()]
    n6[self.assets: list[Asset] = []]
    n7[self.urls_found = 0]
    n8[self.forms_found = 0]
    n9[self.apis_found = 0]
    n10[self.pages_crawled = 0]
    n11[self.fingerprints: Fingerprints | None = None]
    n12[self.errors: list[dict[str, str]] = [...]
    n13[logger.debug(f'Scan context initialized f...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
286. scan context Function repr
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['返回上下文的字符串表示'] n4[stats = self.get_statistics(...] n5[return f"ScanContext(scan_id={self.re...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['返回上下文的字符串表示']
    n4[stats = self.get_statistics(...]
    n5[return f"ScanContext(scan_id={self.re...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
287. scan context Function add asset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 添加資產到收集列表\n\n Args:\n ...] n4[self.assets.append(asset)] n5[logger.debug(f'Asset added: {asset.t...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        添加資產到收集列表\n\n        Args:\n      ...]
    n4[self.assets.append(asset)]
    n5[logger.debug(f'Asset added: {asset.t...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
288. scan context Function add error
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄錯誤信息\n\n Args:\n ...] n4[error_info = {'type': error_...] n5{if url} n6[error_info['url'] = url] n7[] n8[self.errors.append(error_info)] n9[logger.warning(f'Error recorded: {er...] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n7 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄錯誤信息\n\n        Args:\n         ...]
    n4[error_info = {'type': error_...]
    n5{if url}
    n6[error_info['url'] = url]
    n7[]
    n8[self.errors.append(error_info)]
    n9[logger.warning(f'Error recorded: {er...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n7
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n2
289. scan context Function add forms found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的表單計數\n\n Args:\n ...] n4[self.forms_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的表單計數\n\n        Args:\n      ...]
    n4[self.forms_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
290. scan context Function add js analysis result
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄 JavaScript 分析結果\n\n Args...] n4{if not hasattr(self, 'js_analy...} n5[self.js_analysis_results: list[JavaScriptAnalysisR...] n6[] n7[self.js_analysis_results.append(result)] n8[logger.debug(f'JS analysis result recorde...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄 JavaScript 分析結果\n\n        Args...]
    n4{if not hasattr(self, 'js_analy...}
    n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
    n6[]
    n7[self.js_analysis_results.append(result)]
    n8[logger.debug(f'JS analysis result recorde...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
291. scan context Function add sensitive match
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 記錄發現的敏感資料匹配\n\n Args:\n ...] n4{if not hasattr(self, 'sensitiv...} n5[self.sensitive_matches: list[SensitiveMatch] = &#...] n6[] n7[self.sensitive_matches.append(match)] n8[logger.info(f"Sensitive match recorded: ...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        記錄發現的敏感資料匹配\n\n        Args:\n    ...]
    n4{if not hasattr(self, 'sensitiv...}
    n5[self.sensitive_matches: list[SensitiveMatch] = &#...]
    n6[]
    n7[self.sensitive_matches.append(match)]
    n8[logger.info(f"Sensitive match recorded: &#12...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
292. scan context Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取當前統計信息\n\n Returns:\n ...] n4[return {'urls_found': self.u...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取當前統計信息\n\n        Returns:\n    ...]
    n4[return {'urls_found': self.u...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
293. scan context Function increment apis found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的 API 計數\n\n Args:\n ...] n4[self.apis_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的 API 計數\n\n        Args:\n   ...]
    n4[self.apis_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
294. scan context Function increment pages crawled
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加已爬取頁面計數\n\n Args:\n ...] n4[self.pages_crawled += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加已爬取頁面計數\n\n        Args:\n      ...]
    n4[self.pages_crawled += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
295. scan context Function increment urls found
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 增加發現的 URL 計數\n\n Args:\n ...] n4[self.urls_found += count] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        增加發現的 URL 計數\n\n        Args:\n   ...]
    n4[self.urls_found += count]
    n1 --> n3
    n3 --> n4
    n4 --> n2
296. scan context Function reset statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置所有統計計數器'] n4[self.urls_found = 0] n5[self.forms_found = 0] n6[self.apis_found = 0] n7[self.pages_crawled = 0] n8[logger.debug('Statistics reset&#3...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置所有統計計數器']
    n4[self.urls_found = 0]
    n5[self.forms_found = 0]
    n6[self.apis_found = 0]
    n7[self.pages_crawled = 0]
    n8[logger.debug('Statistics reset&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n2
297. scan context Function scan duration
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取掃描持續時間(秒)\n\n Returns:\n ...] n4[return int(time.time() - self._start_...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取掃描持續時間(秒)\n\n        Returns:\n ...]
    n4[return int(time.time() - self._start_...]
    n1 --> n3
    n3 --> n4
    n4 --> n2
298. scan context Function set fingerprints
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 設置指紋信息\n\n Args:\n ...] n4[self.fingerprints = fingerprints] n5[logger.debug('Fingerprints set&#3...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        設置指紋信息\n\n        Args:\n         ...]
    n4[self.fingerprints = fingerprints]
    n5[logger.debug('Fingerprints set&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
299. scan context Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n'] n4[from __future__ import annotations] n5[import time] n6[from typing import TYPE_CHECKING] n7[from services.aiva_common.schemas import Asset, Fi...] n8[from services.aiva_common.utils import get_logger] n9{if TYPE_CHECKING} n10[pass] n11[] n12[logger = get_logger(__name__)] n13[class ScanContext(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n']
    n4[from __future__ import annotations]
    n5[import time]
    n6[from typing import TYPE_CHECKING]
    n7[from services.aiva_common.schemas import Asset, Fi...]
    n8[from services.aiva_common.utils import get_logger]
    n9{if TYPE_CHECKING}
    n10[pass]
    n11[]
    n12[logger = get_logger(__name__)]
    n13[class ScanContext(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n2
300. scan orchestrator Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化掃描編排器'] n4[self.static_parser = StaticContentParser(...] n5[self.fingerprint_collector = FingerprintCollector...] n6[self.sensitive_detector = SensitiveInfoDetecto...] n7[self.js_analyzer = JavaScriptSourceAnal...] n8[self.browser_pool: HeadlessBrowserPool | None = No...] n9[self.dynamic_extractor: DynamicContentExtractor | ...] n10[logger.info('ScanOrchestrator initialized...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化掃描編排器']
    n4[self.static_parser = StaticContentParser(...]
    n5[self.fingerprint_collector = FingerprintCollector...]
    n6[self.sensitive_detector = SensitiveInfoDetecto...]
    n7[self.js_analyzer = JavaScriptSourceAnal...]
    n8[self.browser_pool: HeadlessBrowserPool | None = No...]
    n9[self.dynamic_extractor: DynamicContentExtractor | ...]
    n10[logger.info('ScanOrchestrator initialized...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n2
301. scan orchestrator Function build scan result
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 構建掃描結果\n\n Args:\n ...] n4[summary = Summary(urls_found=c...] n5[return ScanCompletedPayload(scan_id=c...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        構建掃描結果\n\n        Args:\n         ...]
    n4[summary = Summary(urls_found=c...]
    n5[return ScanCompletedPayload(scan_id=c...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
302. scan orchestrator Function reset
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['重置編排器狀態'] n4[self.fingerprint_collector.reset()] n5[logger.info('ScanOrchestrator reset&&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['重置編排器狀態']
    n4[self.fingerprint_collector.reset()]
    n5[logger.info('ScanOrchestrator reset&&...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
303. scan orchestrator Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n'] n4[from __future__ import annotations] n5[from typing import TYPE_CHECKING, Any] n6[from services.aiva_common.schemas import Asset, Sc...] n7[from services.aiva_common.utils import get_logger,...] n8[from .authentication_manager import Authentication...] n9[from .core_crawling_engine.http_client_hi import H...] n10[from .core_crawling_engine.static_content_parser i...] n11[from .core_crawling_engine.url_queue_manager impor...] n12[from .dynamic_engine.dynamic_content_extractor imp...] n13[from .dynamic_engine.headless_browser_pool import ...] n14[from .fingerprint_manager import FingerprintCollec...] n15[from .header_configuration import HeaderConfigurat...] n16[from .info_gatherer.javascript_source_analyzer imp...] n17[from .info_gatherer.sensitive_info_detector import...] n18[from .scan_context import ScanContext] n19[from .strategy_controller import StrategyControlle...] n20{if TYPE_CHECKING} n21[pass] n22[] n23[logger = get_logger(__name__)] n24[class ScanOrchestrator(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n13 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n17 n17 --> n18 n18 --> n19 n19 --> n20 n20 -->|Yes| n21 n20 -->|No| n22 n21 --> n22 n22 --> n23 n23 --> n24 n24 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n']
    n4[from __future__ import annotations]
    n5[from typing import TYPE_CHECKING, Any]
    n6[from services.aiva_common.schemas import Asset, Sc...]
    n7[from services.aiva_common.utils import get_logger,...]
    n8[from .authentication_manager import Authentication...]
    n9[from .core_crawling_engine.http_client_hi import H...]
    n10[from .core_crawling_engine.static_content_parser i...]
    n11[from .core_crawling_engine.url_queue_manager impor...]
    n12[from .dynamic_engine.dynamic_content_extractor imp...]
    n13[from .dynamic_engine.headless_browser_pool import ...]
    n14[from .fingerprint_manager import FingerprintCollec...]
    n15[from .header_configuration import HeaderConfigurat...]
    n16[from .info_gatherer.javascript_source_analyzer imp...]
    n17[from .info_gatherer.sensitive_info_detector import...]
    n18[from .scan_context import ScanContext]
    n19[from .strategy_controller import StrategyControlle...]
    n20{if TYPE_CHECKING}
    n21[pass]
    n22[]
    n23[logger = get_logger(__name__)]
    n24[class ScanOrchestrator(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n13
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n17
    n17 --> n18
    n18 --> n19
    n19 --> n20
    n20 -->|Yes| n21
    n20 -->|No| n22
    n21 --> n22
    n22 --> n23
    n23 --> n24
    n24 --> n2
304. sensitive data scanner Function init
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['初始化敏感資料掃描器'] n4[self.compiled_patterns = {name: re.compile(pa...] n5[self.matches: list[SensitiveMatch] = []] n6[logger.debug('SensitiveDataScanner initia...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['初始化敏感資料掃描器']
    n4[self.compiled_patterns = {name: re.compile(pa...]
    n5[self.matches: list[SensitiveMatch] = []]
    n6[logger.debug('SensitiveDataScanner initia...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n2
305. sensitive data scanner Function determine severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...] n4[critical_patterns = ['aws_secret_key&...] n5[high_patterns = ['aws_access_key&#...] n6[medium_patterns = ['api_key_generic&&...] n7{if pattern_type in critical_pa...} n8[return Severity.CRITICAL] n9{if pattern_type in high_patterns} n10[return Severity.HIGH] n11{if pattern_type in medium_patt...} n12[return Severity.MEDIUM] n13[return Severity.LOW] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n15 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據模式類型判斷嚴重程度\n\n        Args:\n   ...]
    n4[critical_patterns = ['aws_secret_key&...]
    n5[high_patterns = ['aws_access_key&&#35...]
    n6[medium_patterns = ['api_key_generic&&...]
    n7{if pattern_type in critical_pa...}
    n8[return Severity.CRITICAL]
    n9{if pattern_type in high_patterns}
    n10[return Severity.HIGH]
    n11{if pattern_type in medium_patt...}
    n12[return Severity.MEDIUM]
    n13[return Severity.LOW]
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n15
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
306. sensitive data scanner Function get context
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取匹配的上下文\n\n Args:\n ...] n4[context_start = max(0, start - conte...] n5[context_end = min(len(content), en...] n6[context = content[context_star...] n7[match_length = end - start] n8[match_in_context_start = start - context_star...] n9[match_in_context_end = match_in_context_sta...] n10[masked_context = context[:match_in_co...] n11[return masked_context.replace('\n&...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取匹配的上下文\n\n        Args:\n       ...]
    n4[context_start = max(0, start - conte...]
    n5[context_end = min(len(content), en...]
    n6[context = content[context_star...]
    n7[match_length = end - start]
    n8[match_in_context_start = start - context_star...]
    n9[match_in_context_end = match_in_context_sta...]
    n10[masked_context = context[:match_in_co...]
    n11[return masked_context.replace('\n&&#3...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
307. sensitive data scanner Function get severity
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...] n4[critical_patterns = ['aws_secret_key&...] n5[high_patterns = ['aws_access_key&#...] n6[medium_patterns = ['api_key_generic&&...] n7{if pattern_type in critical_pa...} n8[return 'critical'] n9{if pattern_type in high_patterns} n10[return 'high'] n11{if pattern_type in medium_patt...} n12[return 'medium'] n13[return 'low'] n14[] n15[] n16[] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n9 n8 --> n16 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n15 n11 -->|Yes| n12 n11 -->|No| n13 n12 --> n14 n13 --> n14 n14 --> n15 n15 --> n16 n16 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        根據模式類型判斷嚴重程度\n\n        Args:\n   ...]
    n4[critical_patterns = ['aws_secret_key&...]
    n5[high_patterns = ['aws_access_key&&#35...]
    n6[medium_patterns = ['api_key_generic&&...]
    n7{if pattern_type in critical_pa...}
    n8[return 'critical']
    n9{if pattern_type in high_patterns}
    n10[return 'high']
    n11{if pattern_type in medium_patt...}
    n12[return 'medium']
    n13[return 'low']
    n14[]
    n15[]
    n16[]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n9
    n8 --> n16
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n15
    n11 -->|Yes| n12
    n11 -->|No| n13
    n12 --> n14
    n13 --> n14
    n14 --> n15
    n15 --> n16
    n16 --> n2
308. sensitive data scanner Function mask sensitive value
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...] n4{if len(value) <= 8} n5[return '***'] n6[] n7[return f'{value[:4]}... ...] n1 --> n3 n3 --> n4 n4 -->|Yes| n5 n4 -->|No| n6 n5 --> n6 n6 --> n7 n7 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        遮罩敏感值以避免在日誌中暴露\n\n        Args:\n ...]
    n4{if len(value) <= 8}
    n5[return '***']
    n6[]
    n7[return f'{value[:4]}...&#12...]
    n1 --> n3
    n3 --> n4
    n4 -->|Yes| n5
    n4 -->|No| n6
    n5 --> n6
    n6 --> n7
    n7 --> n2
309. sensitive data scanner Function clear matches
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['清空所有匹配記錄'] n4[self.matches.clear()] n5[logger.debug('Cleared all sensitive data ...] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['清空所有匹配記錄']
    n4[self.matches.clear()]
    n5[logger.debug('Cleared all sensitive data ...]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n2
310. sensitive data scanner Function get all matches
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取所有發現的敏感資料匹配\n\n Returns:\...] n4[return self.matches.copy()] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取所有發現的敏感資料匹配\n\n        Returns:\...]
    n4[return self.matches.copy()]
    n1 --> n3
    n3 --> n4
    n4 --> n2
311. sensitive data scanner Function get statistics
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 獲取統計信息\n\n Returns:\n ...] n4[stats: dict[str, Any] = {'total_...] n5{for match in self.matches} n6[stats['by_type'][matc...] n7[stats['by_severity'][...] n8[] n9[return stats] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n8 n6 --> n7 n7 --> n5 n8 --> n9 n9 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        獲取統計信息\n\n        Returns:\n      ...]
    n4[stats: dict[str, Any] = {'total_...]
    n5{for match in self.matches}
    n6[stats['by_type'][matc...]
    n7[stats['by_severity'][...]
    n8[]
    n9[return stats]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n8
    n6 --> n7
    n7 --> n5
    n8 --> n9
    n9 --> n2
312. sensitive data scanner Function scan content
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 掃描內容中的敏感資料\n\n Args:\n ...] n4[matches: list[SensitiveMatch] = []] n5{for (pattern_name, pattern_regex) in self.compile...} n6[found_matches = pattern_regex.findit...] n7{for match in found_matches} n8[sensitive_match = SensitiveMatch(match...] n9[matches.append(sensitive_match)] n10[self.matches.append(sensitive_match)] n11[logger.warning(f'Sensitive data found: &#...] n12[] n13[] n14{if matches} n15[logger.info(f'Found {len(matches...] n16[] n17[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 -->|Yes| n6 n5 -->|No| n13 n6 --> n7 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n7 n12 --> n5 n13 --> n14 n14 -->|Yes| n15 n14 -->|No| n16 n15 --> n16 n16 --> n17 n17 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        掃描內容中的敏感資料\n\n        Args:\n     ...]
    n4[matches: list[SensitiveMatch] = []]
    n5{for (pattern_name, pattern_regex) in self.compile...}
    n6[found_matches = pattern_regex.findit...]
    n7{for match in found_matches}
    n8[sensitive_match = SensitiveMatch(match...]
    n9[matches.append(sensitive_match)]
    n10[self.matches.append(sensitive_match)]
    n11[logger.warning(f'Sensitive data found: &#...]
    n12[]
    n13[]
    n14{if matches}
    n15[logger.info(f'Found {len(matches...]
    n16[]
    n17[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 -->|Yes| n6
    n5 -->|No| n13
    n6 --> n7
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n7
    n12 --> n5
    n13 --> n14
    n14 -->|Yes| n15
    n14 -->|No| n16
    n15 --> n16
    n16 --> n17
    n17 --> n2
313. sensitive data scanner Function scan headers
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...] n4[matches: list[SensitiveMatch] = []] n5[sensitive_headers = ['authorization&&...] n6{for (header_name, header_value) in headers.items&...} n7{if header_name.lower() in sens...} n8[sensitive_match = SensitiveMatch(match...] n9[matches.append(sensitive_match)] n10[self.matches.append(sensitive_match)] n11[logger.warning(f'Sensitive header found: ...] n12[] n13[] n14[return matches] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 -->|Yes| n7 n6 -->|No| n13 n7 -->|Yes| n8 n7 -->|No| n12 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n12 n12 --> n6 n13 --> n14 n14 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        掃描 HTTP 標頭中的敏感資料\n\n        Args:\...]
    n4[matches: list[SensitiveMatch] = []]
    n5[sensitive_headers = ['authorization&&...]
    n6{for (header_name, header_value) in headers.items&...}
    n7{if header_name.lower() in sens...}
    n8[sensitive_match = SensitiveMatch(match...]
    n9[matches.append(sensitive_match)]
    n10[self.matches.append(sensitive_match)]
    n11[logger.warning(f'Sensitive header found: ...]
    n12[]
    n13[]
    n14[return matches]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 -->|Yes| n7
    n6 -->|No| n13
    n7 -->|Yes| n8
    n7 -->|No| n12
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n12
    n12 --> n6
    n13 --> n14
    n14 --> n2
314. sensitive data scanner Module
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...] n4[from __future__ import annotations] n5[import re] n6[from typing import Any] n7[from services.aiva_common.enums import Severity] n8[from services.aiva_common.schemas import Sensitive...] n9[from services.aiva_common.utils import get_logger,...] n10[logger = get_logger(__name__)] n11[class SensitiveDataScanner(...)] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 --> n10 n10 --> n11 n11 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
    n4[from __future__ import annotations]
    n5[import re]
    n6[from typing import Any]
    n7[from services.aiva_common.enums import Severity]
    n8[from services.aiva_common.schemas import Sensitive...]
    n9[from services.aiva_common.utils import get_logger,...]
    n10[logger = get_logger(__name__)]
    n11[class SensitiveDataScanner(...)]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 --> n10
    n10 --> n11
    n11 --> n2
315. strategy controller Function estimate scan time
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['\n 估算掃描時間(秒)\n\n Args:\n ...] n4[params = self._parameters] n5[pages = min(estimated_pages,...] n6[time_by_rate = pages / params.reque...] n7[time_by_timeout = pages * params.reque...] n8[estimated_time = max(time_by_rate, ti...] n9{if params.enable_dynamic_scan} n10[estimated_time *= 1.5] n11[] n12[return estimated_time] n1 --> n3 n3 --> n4 n4 --> n5 n5 --> n6 n6 --> n7 n7 --> n8 n8 --> n9 n9 -->|Yes| n10 n9 -->|No| n11 n10 --> n11 n11 --> n12 n12 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['\n        估算掃描時間(秒)\n\n        Args:\n      ...]
    n4[params = self._parameters]
    n5[pages = min(estimated_pages,...]
    n6[time_by_rate = pages / params.reque...]
    n7[time_by_timeout = pages * params.reque...]
    n8[estimated_time = max(time_by_rate, ti...]
    n9{if params.enable_dynamic_scan}
    n10[estimated_time *= 1.5]
    n11[]
    n12[return estimated_time]
    n1 --> n3
    n3 --> n4
    n4 --> n5
    n5 --> n6
    n6 --> n7
    n7 --> n8
    n8 --> n9
    n9 -->|Yes| n10
    n9 -->|No| n11
    n10 --> n11
    n11 --> n12
    n12 --> n2
316. strategy controller Function is dynamic scan enabled
flowchart scan
flowchart TB n1([開始]) n2([結束]) n3['是否啟用動態掃描'] n4[return self._parameters.enable_dynami...] n1 --> n3 n3 --> n4 n4 --> n2
flowchart TB
    n1([開始])
    n2([結束])
    n3['是否啟用動態掃描']
    n4[return self._parameters.enable_dynami...]
    n1 --> n3
    n3 --> n4
    n4 --> n2